go没有构造函数的功能,结构体初始化过程可以使用函数封装实现。
1. 模拟构造函数重载
使用结构体描述猫的属性,根据颜色和名字区分不同的猫。使用颜色和名字两个属性作为猫结构体的两个字段,用于构造不同猫的实例。
// 定义Cat类型,包含颜色和名字两个成员变量字段
type Cat struct {
Color string
Name string
}
// 构造猫函数,用名字入参填充Cat结构体,返回Cat指针类型
func NewCatByName(name string) *Cat {
return &Cat{ // 返回Cat类型的实例
Name: name,
}
}
// 构造猫函数,用颜色入参,返回Cat指针类型
func NewCatByColor(color string) *Cat {
return &Cat{
Color: color, // 入参处理
}
}
注:*Cat是Cat指针类型;&Cat{Color:color,}返回对应结构体实例的内存地址。
go没有函数重载,为了避免函数名冲突,使用NewCatByColor和NewCatByName两个函数表示不同的过程。
用户根据自己需要,使用函数,把参数传递到结构体填充位置,即可完成构造函数。
2. 模拟父子级构造调用
黑猫是一种猫,同时描述这两种概念,就是派生。黑猫派生自猫,使用结构体描述这种关系,把猫结构体(Cat)嵌入黑猫(BlackCat)中,表示黑猫有猫的属性,然后使用构造函数实例化猫结构体(Cat)和黑猫(BlackCat)结构体。
type Cat struct {
Color string
Name string
}
// 定义BlackCat结构体,嵌入Cat,类似派生。
// BlackCat拥有Cat的所有成员变量,实例化后,可以自由访问Cat的所有成员
type BlackCat struct{
Cat
}
// 构造基类Cat实例
func NewCat(name string) *Cat {
return &Cat{
Name: name,
}
}
// 构造子类BlackCat实例
func NewBlackCat(color string) *BlackCat {
cat := &BlackCat{} // 实例化BlackCat结构体,同时Cat也被实例化
cat.Color = color // 填充BlackCat中嵌入Cat的成员变量Color,BlackCat的成员变量都来自Cat
return cat // 返回*BlackCat结构体指针类型
}