我很困惑为什么这段代码不起作用:
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的类型更改为切片是正确的。
答案 0 :(得分:8)
切片本质上是引用类型,这意味着切片头包含指向后备数组的指针,因此它们可以在没有指针接收器的情况下进行突变。调用方法时,完全复制不是引用类型的数组。
为了使用数组执行此操作,您需要更改所有内容以使用指针,因此您的代码可能类似于:
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)
}