[英]pointer receiver vs value receiver
情况:
我已经了解了指针接收器和值接收器 。 据我所知:如果你想修改对象本身,你需要使用指针接收器。 我在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]
}
Less
和Len
方法使用值接收器 ,这是有道理的,因为它们返回数据而不是修改Sequence
状态。
但是在Swap
示例中,我很好奇为什么它仍然在使用值接收器时看起来它正在尝试修改其状态。
题:
这是一个错误,还是我对价值/指针接收器的理解在某种程度上存在缺陷?
为了扩展@ squiguy的注释,切片对象的值本身就是对底层数组的引用,包括指向切片开始的数组中元素的指针,切片的长度以及切片的容量(从切片的开头到数组的末尾的底层数组中的元素数量。 将切片传递给函数时,它是通过值传递的上述信息,因此函数内的切片仍然引用相同的基础数组。 这就是Swap
能够交换切片中元素的方式,即使切片本身是按值传递的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.