我正在阅读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
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)
您可以看到:切片变量的地址发生了变化,但该切片中第一个元素的地址保持不变。