Go语言虽然不支持面向对象语法元素,但Go语言也有方法。和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,即称之为Go receiver参数。receiver参数是方法与类型之间的纽带
Go方法的一般声明形式如下:
func (receiver T/T*) MethodName(参数列表) (返回值列表) {
// 函数体
}
上面方法声明中的T/T*称为receiver的基类型。通过receiver,上述方法被绑定到类型T/T上。可以通过类型T/T的实力调用该方法。
Go方法有如下特征:
- 方法名的首字母是否大写决定该方法是不是导出方法
- 方法定义要与类型定义放在一个保内。因此不能为原生类型添加方法,只能为自定义类型定义方法;同样不能横跨Go包为其他保内自定义类型定义方法
- 每个方法只能有一个receiver参数,不支持多receiver参数列表或变长receiver参数。
- receiver参数的基类型本身不能是指针类型或接口类型
一、方法的本质
Go方法定义:
type T struct {
a int
}
func (t T) Get() int {
return t.a
}
func (t *T) Set(a int) int {
t.a = a
return t.a
}
C++的对象在调用方法时,编译器会自动传入指针对象自身的this指针作为方法的第一个参数。而对于Go,receiver其实也是同样的原理,将receiver作为第一个参数传入方法的参数列表。所以上述定义方法可以等价转换为下面普通方法:
func Get(t T) int