为什么在实现 golang 类型的 sort.Interface 时,方法接收者不需要是指针?

Jac*_*ine 5 go

我正在阅读sort stdlib 包的文档,示例代码如下所示:

type ByAge []Person

func (a ByAge) Len() int           { return len(a) }
func (a ByAge) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
Run Code Online (Sandbox Code Playgroud)

据我所知,改变类型的函数T需要用作*T其方法接收器。在这种情况下,Len为什么它有效?或者我是否误解了使用与作为方法接收者之间的区别?SwapLessT*T

nem*_*emo 3

Go 有三种引用类型:

  • 地图
  • 渠道

这些类型的每个实例都在内部保存一个指向实际数据的指针。这意味着当您传递这些类型之一的值时,该值会像其他值一样被复制,但内部指针仍然指向相同的值。

简单示例(运行时运行):

func dumpFirst(s []int) {
    fmt.Printf("address of slice var: %p, address of element: %p\n", &s, &s[0])
}

s1 := []int{1, 2, 3}
s2 := s1

dumpFirst(s1)
dumpFirst(s2)
Run Code Online (Sandbox Code Playgroud)

将打印类似以下内容:

address of slice var: 0x1052e110, address of element: 0x1052e100
address of slice var: 0x1052e120, address of element: 0x1052e100
Run Code Online (Sandbox Code Playgroud)

您可以看到:切片变量的地址发生了变化,但该切片中第一个元素的地址保持不变。