去功能去神秘化

时间:2015-12-03 00:51:05

标签: go

刚刚得到关于此代码的基本Go问题:

type Ips []string
func (a Ips) Swap(i, j int) { a[i], a[j] = a[j], a[i] }

我相信(a Ips)是Swap函数的参数,但为什么它不能在括号内?

2 个答案:

答案 0 :(得分:1)

a Ips是该方法的接收者。其参数为i intj int。这是绑定到Ips类型的方法,数组中的两个字符串并不返回任何内容。

试试on the playground

答案 1 :(得分:0)

(a Ips)被称为'接收者'。它是调用该方法的类型。事实上,它在任何其他参数中传递给方法(回想一下他们谈论在堆栈上推送参数的那个类)。在这种情况下,它是一个值类型,因此与用作参数的其他值类型一样,会生成参数的副本,然后是在堆栈上推送的内容。这也意味着当方法返回并且弹出堆栈时它将超出范围。

主要区别在于您需要一个接收类型的实例才能调用该方法。如果方法没有接收类型,那么它就是封装的作用域,可以在包内的任何地方调用,或者,如果导出,可以从导入的包别名中调用。