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

type MyObject string

var objects []MyObject

我想对这些对象进行排序。标准库有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

}


明月笑刀无情
浏览 153回答 2
2回答

PIPIONE

如果您的MyObject类型是string其基础类型的“别名”&nbsp;,则不能。在此处查看@JimB 的回答。的底层类型MyObject与的底层类型string(它本身就是string:)[]MyObject相同,但 的底层类型与 的底层类型不同[]string。但是如果你碰巧重构了一点你的类型系统,你的问题就会消失:type MyObjects []stringvar objects MyObjectsfunc main() {&nbsp; &nbsp; objects = MyObjects{"abc", "aaa"}&nbsp; &nbsp; sort.Strings(objects)&nbsp; &nbsp; fmt.Println(objects)}输出(在 上试试Go Playground):[aaa abc]为方便起见,Sort()如果您想,您甚至可以提供一个方法:func (m MyObjects) Sort() {&nbsp; &nbsp; sort.Strings(m)}并使用它:objects = MyObjects{"abc", "aaa"}objects.Sort()fmt.Println(objects)(输出相同。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go