Go从入门到精通——结构体——构造函数——结构体和类型的一系列初始化操作的函数封装
构造函数——结构体和类型的一系列初始化操作的函数封装
Go 语言的类型或结构体没有构造函数的功能。结构体的初始化过程可以使用函数封装实现。
1 2 3 4 5 | 提示:其他编程语言构造函数的一些常见功能及特性如下: 1、每个类可以添加构造函数,多个构造函数使用函数重载实现。 2、构造函数一般与类名同名,且没有返回值。 3、构造函数有一个静态构造函数,一般用这个特性来调用父类的构造函数。 4、对于 C++ 来说,还有默认构造函数,拷贝构造函数等。 |
一、多种方式创建和初始化结构体——模拟构造函数重载
如果使用结构体描述猫的特性,那么根据猫的颜色和名字可以有不同种类的猫。那么不同颜色和名字就是结构体的字段,同时可以使用颜色和名字构造不同类的猫的实例,这个过程可以参考如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | type Cat struct { Color string Name string } func NewCatByName(name string) *Cat{ return &Cat{ Name: name, } } func NewCatByColor(color string) *Cat{ return &Cat{ Color: color, } } |
由于 Go 语言中没有函数重载,为了避免函数名字冲突,使用 NewCatByName() 和 NewCatByColor() 两个不同的函数名表示不同的 Cat 构造过程。
二、带有父子关系的结构体的构造和初始化——模拟父级构造调用
黑猫是一种猫,猫是黑猫的一种泛称。同时描述这两种概念时,就是派生,黑猫派生自猫的种类。使用结构体描述猫和黑猫的关系时,将猫(Cat)的结构体嵌入到黑猫(BlackCat)中,表示黑猫拥有猫的特性,然后再使用两个不同的构造函数分别构造出黑猫和猫两个结构体实例,参考下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | type Cat struct { Color string Name string } type BlackCat struct { Cat //嵌入 Cat,类似派生 } // 构造基类 // NewCat() 函数定义了 Cat 的构造过程,使用名字作为参数,填充 Cat 结构体。 func NewCat(name string) *Cat { return &Cat{ Name: name, } } //构造子类 //NewBlackCat() 函数使用 color 作为参数,构造返回 BlackCat 指针。 func NewBlackCat(color string) *BlackCat { //实例化 BlackCat 结构,此时 Cat 也同时被实例化 cat := &BlackCat{} //填充 BlackCat 中嵌入的 Cat 颜色属性。 //BlackCat 没有任何成员,所有的成员都来自 Cat。 cat.Color = color return cat } |
这个例子中,Cat 结构体类似于面向对象中的 “基类”。BlackCat 嵌入 Cat 结构体,类似于面向对象中 “派生”。实例化时,BlackCat 中的 Cat 也会一并被实例化。
总之,Go 语言中并没有提供构造函数相关的特殊机制,用户根据自己的需求,将参数使用函数传递到结构体构造参数中即可完成构造函数的任务。