如何对Go的切片进行排序,其元素类型是字符串的别名,而不是字符串本身?

Ste*_*sky 3 sorting types go

type MyObject string
var objects []MyObject
Run Code Online (Sandbox Code Playgroud)

我想对这些对象进行排序.标准库有sort.Strings,但需要一个实例[]string而不是[]MyObject.

我目前的解决方案是实现sort.Interface(如下所示)并使用sort.Sort,但我想摆脱那个样板代码.有更好的方法吗?

type MyObjects []MyObject

func (objs MyObjects) Len() int {
    return len(objs)
}

func (objs MyObjects) Less(i, j int) bool {
    return strings.Compare(string(objs[i]), string(objs[j])) < 0
}

func (objs MyObjects) Swap(i, j int) {
    o := objs[i]
    objs[i] = objs[j]
    objs[j] = o
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 6

不可以.由于Go不允许在切片内隐式转换类型(也没有与接口的协方差),因此您需要为您的类型提供适当的方法.

type MyObjects []MyObject

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

如果你真的想这样做,你可以使用不安全(但请不要).我怀疑这三行额外的安全代码会给你带来很大的不同.

http://play.golang.org/p/d6ciFjjr2c

objects := []MyObject{"one", "two", "three", "four"}
sort.Strings(*(*[]string)(unsafe.Pointer(&objects)))
Run Code Online (Sandbox Code Playgroud)