Go正确排序切片,但不排序数组

时间:2014-01-08 14:29:09

标签: go

我很困惑为什么这段代码不起作用:

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的类型更改为切片是正确的。

1 个答案:

答案 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)
}