Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何对元素类型为字符串别名而不是字符串本身的Go切片进行排序?_Sorting_Types_Go - Fatal编程技术网

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

Sorting 如何对元素类型为字符串别名而不是字符串本身的Go切片进行排序?,sorting,types,go,Sorting,Types,Go,我想对这些对象进行排序。标准库具有sort.Strings,但这需要[]string的实例,而不是[]MyObject 我目前的解决方案是实现sort.Interface(如下所示)并使用sort.sort,但我想去掉那个样板代码。有更好的方法吗 type MyObject string var objects []MyObject 类型MyObjects[]MyObject func(objs MyObjects)Len()int{ 返回len(objs) } func(objs MyObj

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

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

type MyObject string
var objects []MyObject
类型MyObjects[]MyObject
func(objs MyObjects)Len()int{
返回len(objs)
}
func(objs MyObjects)减去(i,j int)bool{
返回字符串。比较(字符串(objs[i]),字符串(objs[j]))<0
}
func(objs MyObjects)交换(i,j int){
o:=objs[i]
objs[i]=objs[j]
objs[j]=o
}

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

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
}
如果您的
MyObject
类型是一个“别名”,而
string
是它的基础类型,则您不能这样做。看这里

MyObject
的基础类型与
string
的基础类型相同(其本身为:
string
),但
[]MyObject
的基础类型与
[]string
的基础类型不同

请参阅此处的进一步说明:

但是,如果您碰巧对类型系统进行了一点重构,您的问题就会消失:

objects := []MyObject{"one", "two", "three", "four"}
sort.Strings(*(*[]string)(unsafe.Pointer(&objects)))
输出(在上尝试):

为了方便起见,如果您想:

[aaa abc]
使用它:

func (m MyObjects) Sort() {
    sort.Strings(m)
}

(输出相同。)

顺便说一句,
字符串的文档。Compare
明确指出您通常不应该使用它;只要做
返回objs[i]
(或者如果有抱怨,那么将它们转换为
字符串
)。而且,惯用的
交换将是:
func(p MyObjects)交换(i,j int){p[i],p[j]=p[j],p[i]}
,通过这些简化,这一点也不错。学到的教训:我需要写更多的东西才能变得更惯用。我明白了。不幸的是,
类型MyObjects[]string
不是我的选项。
MyObject
实例附带了相当多的逻辑,因此我需要特定的类型。
p[I]、p[j]=p[j]、p[I]
符号(感谢您提醒我:)和紧凑的函数体将样板文件减少到了最低限度,因此我将使用它。
[aaa abc]
func (m MyObjects) Sort() {
    sort.Strings(m)
}
objects = MyObjects{"abc", "aaa"}
objects.Sort()
fmt.Println(objects)