10.1 定义 struct

定义

type identifier struct {
    field1 type1
    field2 type2
    ...
}

创建

var s T
s.a = 5
s.b = 8
var t *T
t = new(T)

内存布局

Go 的结构体中的数据(包括嵌套的结构体(非指针))在内存中连续存在。

工厂方法:形如 matrix.NewMatrix (...) 的方法,和 C 语言模拟面向对象的操作很像。

与 C++ 不同 如果 File 是一个结构体类型,那么表达式 new (File)&File {} 是等价的。

结构体标签

type TagType struct { // tags
	field1 bool   "An important answer"
	field2 string "The name of the thing"
	field3 int    "How much there are"
}

Tag 只能通过反射获取。

结构体内嵌

type innerS struct {
	in1 int
	in2 int
}

type outerS struct {
	b    int
	c    float32
	int  // anonymous field
	innerS //anonymous field
}

innerS 相当于被展开于 outerS,可以这样访问:

outer.int

**外层名字会覆盖内层名字 **

10.2 方法

Go 方法是作用在接收者(receiver)(类似 this 指针)上的一个函数

func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }

getter/setter

package person

type Person struct {
	firstName string
	lastName  string
}

func (p *Person) FirstName() string {
	return p.firstName
}

func (p *Person) SetFirstName(newName string) {
	p.firstName = newName
}

继承

使用类似 mixin 的机制:

type Engine interface {
	Start()
	Stop()
}

type Car struct {
	Engine
}

由于机制简单,所以可以容易地进行多继承

x.String () 方法

如果类型定义了 String () 方法,它会被用在 fmt.Printf () 中生成默认的输出:等同于使用格式化描述符 %v 产生的输出。

10.3 GC

调用 runtime.GC () 函数可以显式的触发 GC

如果需要在一个对象 obj 被从内存移除前执行一些特殊操作,比如写到日志文件中,可以通过如下方式调用函数来实现:

runtime.SetFinalizer(obj, func(obj *typeObj))