指针接收者 vs 值接收者
pointer receiver vs value receiver
情况:
我了解了指针接收器和值接收器 。据我了解:如果要修改对象本身,则需要使用指针接收器。我在 go documentation 中阅读了更多关于接口的内容,发现了这段代码:
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
的例子中,我很好奇为什么它看起来像是在尝试修改时仍然使用值接收器它的状态。
问题:
这是一个错误,还是我对 value/pointer 接收器的理解存在某种缺陷?
扩展一下@squiguy 的评论,切片对象的值本身就是对底层数组的引用,包括指向数组中切片开始处的元素的指针、切片的长度、和切片的容量(底层数组中从切片开始到数组末尾的元素数)。当你将切片传递给函数时,传递的是上面的信息,所以函数内的切片仍然引用同一个底层数组。这就是 Swap
能够交换切片中元素的方式,即使切片本身是按值传递的。
情况:
我了解了指针接收器和值接收器 。据我了解:如果要修改对象本身,则需要使用指针接收器。我在 go documentation 中阅读了更多关于接口的内容,发现了这段代码:
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
的例子中,我很好奇为什么它看起来像是在尝试修改时仍然使用值接收器它的状态。
问题:
这是一个错误,还是我对 value/pointer 接收器的理解存在某种缺陷?
扩展一下@squiguy 的评论,切片对象的值本身就是对底层数组的引用,包括指向数组中切片开始处的元素的指针、切片的长度、和切片的容量(底层数组中从切片开始到数组末尾的元素数)。当你将切片传递给函数时,传递的是上面的信息,所以函数内的切片仍然引用同一个底层数组。这就是 Swap
能够交换切片中元素的方式,即使切片本身是按值传递的。