1

情况:

我已经了解了指针接收器值接收器。据我了解:如果要修改对象本身,则需要使用指针接收器。我在go 文档中阅读了有关接口的更多信息,并发现了这段代码:

type Sequence []int

// Methods required by sort.Interface.
func (s Sequence) Len() int {
    return len(s)
}
func (s Sequence) Less(i, j int) bool {
    return s[i] < s[j]
}
func (s Sequence) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
  • LessandLen方法使用值接收器,这是有道理的,因为它们正在返回数据而不是修改Sequence状态。

  • 但是在这个例子中,我很好奇为什么当它看起来试图修改它的状态时它Swap仍然使用一个值接收器。

问题:

这是一个错误,还是我对值/指针接收器的理解在某种程度上存在缺陷?

4

1 回答 1

3

为了扩展@squiguy的评论,切片对象的值本身就是对底层数组的引用,包括指向数组中切片开始的元素的指针、切片的长度和切片的容量(底层数组中从切片开头到数组结尾的元素数)。将切片传递给函数时,是按值传递的就是上面的信息,所以函数内的切片仍然引用同一个底层数组。这就是Swap即使切片本身是按值传递的,也能够交换切片中的元素的方式。

于 2017-01-20T18:01:16.573 回答