我很困惑为什么这段代码不起作用:
package main import ( "fmt" "sort" ) type T [2]int func (t T) Len() int { return len(t) } func (t T) Swap(i, j int) { t[i], t[j] = t[j], t[i] } func (t T) Less(i, j int) bool { return t[i] < t[j] } func main() { var x = [2]int{1, 0} fmt.Println(x) sort.Sort(T(x)) fmt.Println(x) }
它输出(错误):
[1 0] [1 0]
将T的类型更改为切片是正确的.
切片本质上是引用类型,这意味着切片头包含指向后备数组的指针,因此它们可以在没有指针接收器的情况下进行突变.调用方法时,完全复制不是引用类型的数组.
为了使用数组执行此操作,您需要更改所有内容以使用指针,因此您的代码可能类似于:
package main import ( "fmt" "sort" ) type T [2]int func (t *T) Len() int { return len(t) } func (t *T) Swap(i, j int) { t[i], t[j] = t[j], t[i] } func (t *T) Less(i, j int) bool { return t[i] < t[j] } func main() { var x = T([2]int{1, 0}) fmt.Println(x) sort.Sort(&x) fmt.Println(x) }