前言
- Go的方法是作用在接收者上的一个函数,接收者是某种类型的变量,因此方法是一种特殊的函数
- 接收者不能是接口类型,因为接口是一个抽象定义,但是方法是一个具体实现
- 接收者是指针类型变量的时候,可以改变接收者变量的值
方法定义
func (recv receiver_type) methodName(parameter_list) (return_value_list) { ... }
复制代码
- 在方法名之前,func关键字之后的括号中指定接收者
- recv类似于面向对象语言中的this或self,Go中并没有这两个关键字
Go中的面向对象
- 结构体 + 方法 = 面向对象中的类
- 结构体和方法可以放在不同的源文件,但是必须在同一个包
如果想要打破这条规则,可以为类型定义别名,然后再为别名定义方法,这样就可以不在同一个包下
- 类型T(或者*T)上的所有方法的集合叫做类型T(或*T)的方法集
方法不允许重载
方法实际上也是函数,函数不能重载
- 基于接收者类型的方法重载是允许的
// 接收者类型不一样的时候,允许方法重载
func (receiver receiverType1) func1 (args... argType) returnType
func (receiver receiverType2) func1 (args... argType) returnType
复制代码
非结构体类型变量调用方法的实现方式
// 1. 给非结构体类型定义别名
type IntVector []int
// 2. 创建方法
func (v IntVector) sum() (s int){
for _, x := range v {
s += x
}
return
}
func main(){
// 3. 调用方法
IntVector{1,2,3}.sum();
}
复制代码
函数和方法的区别
- 函数将变量作为参数
- 方法在变量上被调用
- 接收者类型跟方法必须在同一个包中
入门教程推荐: github.com/Unknwon/the…