## 定义 类的定义是依托结构体来的,比如 ``` type Person struct { name string age uint male bool } ``` ## 初始化 go不支持构造函数,析构函数,可以定义NewXXX这样的全局函数来实现类的初始化 ``` func NewPerson(name string, age uint, male bool) *Person { return &Person{name, age, male} } ``` ## 成员方法 要为 Go 类添加成员方法,需要在`func`和方法名之间添加方法所属的类型声明(有的地方将其称之为`接收者声明`) **值方法** ``` func (p Person) GetName() string { return p.name } ``` Go 语言面向对象编程不像 PHP、Java 那样支持隐式的`this`指针,所有的东西都是显式声明的 若要修改类的属性,则类型声明需要设置成指针类型 **指针方法** ``` func (p *Person) SetName(name string) { p.name = name } ``` ## 字符串格式打印类的实例 PHP、Java 支持默认调用类的`toString`方法以字符串格式打印类的实例,Go 语言也有类似的机制,只不过这个方法名是`String` ``` func (p *Person) String() string { return fmt.Sprintf("{name: %s, age: %d, male: %t}", p.name, p.age, p.male) } ``` 直接打印类实例,无需调用`String`方法 同一个方法集合中的方法不能出现重名,并且,如果它们所属的是一个结构体类型,那么它们的名称与该类型中任何字段的名称也不能重复。 ## 基本数据类型添加成员方法 在 Go 语言中,你可以给任意类型(包括基本类型,但不包括指针类型)添加成员方法,但是如果是基本类型的话,需要借助`type`关键字对类型进行再定义 ``` type Integer int func (a Integer) Equal(b Integer) bool { return a == b } ``` ## 继承和方法重构 通过组合来实现类的继承和方法重构 ``` type Dog struct { Animal } ```