# 结构体
Go 到底是不是面向对象语言, Go 的官方解释: "Yes and No." Go 语言仅支持封装,不支持继承和多态 Go 语言没有class,只有struct
# 一. 结构体
结构体是将多个任意类型的命名变量组合在一起的聚合数据类型。
# 对数据进行封装
type Employee struct {
Id string
Name string
Age int
}
# 实例创建及初始化
type Employee struct {
Id string
Name string
Age int
}
func TestCreateEmployeeObj(t *testing.T) {
e := Employee{"0", "Bob", 20}
e1 := Employee{Name: "Mike", Age: 30}
e2 := new(Employee) // 返回指针
e2.Id = "2"
e2.Age = 22
e2.Name = "Rose"
t.Log(e) // expect: ID:0-Name:Bob-Age=20
t.Log(e1) // expect: ID:-Name:Mike-Age=30
t.Log(e1.Id) // expect:
t.Log(e2) // expect: ID:2-Name:Rose-Age=22
t.Log("e is %T", e) // expect: e is encap.Employee
t.Log("e2 is %T", e2) // expect: e is *encap.Employee
}
# 二. 定义结构体方法
func (e *Employee) String() string{
return fmt.Sprintf("ID:%s/Name:%s/Age:%d", e.Id, e.Name, e.Age)
}
# 三. 扩展已有类型
go为结构定义的方法必须放在同一个包内,如果这个包是开源的,或者其他人写的,那我们如何扩展呢?java中有继承的概念,go中如何扩充系统类型或者别人的类型呢?\
go中扩充类型有两种方法
- 定义别名
- 使用组合
- 内嵌 (Embedding)
内嵌方式扩展类型,示例中 myTreeNode 是我们自己定义的类型,它包含 tree 包中定义的 Node 中所有的字段和方法
type myTreeNode struct {
*tree.Node // Embedding 内嵌
}
WARNING
TODO: 不太理解,待补充