为何在Go中可给无参数的接收者函数传递参数调用?
问题示例代码
type Num []int type Number interface{ gimmeNum() int } func (n Num) gimmeNum() int { if len(n) == 0{ return -1 } return n[0] } func main(){ nums := Num{1, 2, 3} n := Number.gimmeNum(nums) // how is this possible? fmt.Println(n) }
在上述代码中,
gimmeNum()函数未定义接收参数,但在main函数中我却能向它传递参数并正常运行!Go语言为何允许这种操作?
原因解析
这是Go语言中接口类型调用方法的特殊语法,本质是编译器做了自动转换:
- 当你用
接口类型.方法名(实例)的形式调用时,Go会把它等价转换为实例.方法名()的调用 - 这里的
Number.gimmeNum(nums)其实是编译器语法糖,实际执行的是nums.gimmeNum()——因为Num类型实现了Number接口的gimmeNum方法 - 这种写法的本质是通过接口类型来调用实现了该接口的类型的方法,Go编译器会自动把传入的参数作为方法的接收者处理,所以你看起来像是给无参数的方法传了参数,实际是把这个参数作为方法的接收者来使用
内容的提问来源于stack exchange,提问作者Manuel Antony
相关产品推荐
相关产品推荐

