# 结构体

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: 不太理解,待补充