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)
不可以.由于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)