pointers - 指针接收者 vs 值接收者

标签 pointers go go-interface

情况:

我了解了指针接收器值接收器。据我了解:如果要修改对象本身,则需要使用指针接收器。我在 go documentation 中阅读了更多关于接口(interface)的信息并找到了这段代码:

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]
}
  • LessLen 方法使用值接收器,这是有道理的,因为它们返回数据而不是修改序列 状态。

  • 但在 Swap 示例中,我很好奇为什么它在看起来试图修改其状态时仍在使用 值接收器

问题:

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

最佳答案

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

关于pointers - 指针接收者 vs 值接收者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41768993/

相关文章:

c++ - 激活智能指针?

go - 类型转换接口(interface) slice

json - 从字节数组创建结构

go - 我通常可以为 Golang 结构指定方法吗?

json - Go lang 解码 io.read JSON 与 JSON解码给出不同的结果

c++ - 将文本文件读入双向链表并输出 - C++

c - 打印指针时出现段错误

c - 在 C 中的二维字符数组中存储和返回本地指针

go - 如何从gin gonic中的POST负载读取变量?

http - golang 中 http POST 的预检问题