假设有如下伪代码:
```go
//--------------------------------AREA 1 BEGIN
type A struct{
x int
y int
}
//---------------------------------AREA 1 END
func f(){
a = []A{A{1,1},A{1,2}}//或更多,仅仅是个例子
/**
目的:使用sort将a数组先按x排序,再按y排序
条件:不在AREA 1中添加代码(即f函数体外)
原因:希望排序条件的相关代码作用域仅仅存在于f函数中
问题:不知道该如何解决这个问题,或者能仅仅提供解决这个问题的关键字也行
*/
}
```
找了半天了不知道怎么解决这个问题
或者如果是golang本身不建议这么做的话希望大神们能告诉我
如果有知道的大神能解答这个问题,真是感激不尽
如果比较懒懒得打代码告诉我怎么解决,如果能提供两个解决这个问题的关键字,我也是十分感激的
谢谢
1.在函数f之外可以通过 实现 sort.Interface的三个方法来使 A 具备排序功能,重点重写其 Less 方法。
2.在函数f内部要实现的话,就需要手动写很多代码,对 a 这个slice进行各种操作了,主要思路是通过变换将 每个元素的x,y体现到 slice的index上,然后对slice按照index排序就行了
第一种方案,代码清晰优雅,建议使用。
#1
更多评论
示例:
```go
package main
import (
"fmt"
"sort"
)
type User struct {
Name string
Age int
}
func main() {
Sort()
}
func Sort() {
users := []*User{
{"polaris", 23},
{"studygolang", 29},
{"polaris", 21},
{"studygolang", 27},
{"polaris", 24},
{"studygolang", 25},
}
sort.Slice(users, func(i, j int) bool {
if users[i].Name == users[j].Name {
return users[i].Age < users[j].Age
}
return users[i].Name < users[j].Name
})
for _, user := range users {
fmt.Println(*user)
}
}
```
https://goplay.space/#LrwMQ45tOA
#2
用<a href="/user/polaris" title="@polaris">@polaris</a> 的方式就可以解决你的问题了。
如果你有大量集合数据需要排序、过滤、映射等操作,可以看看我写的这个库(刚开始写,还有好多问题,仅供参考)
https://github.com/tk103331/stream
可以像这样操作
`stream.Of(12,94,61,98,13,37,15).Sort(func(n1,n2 int)(return n1<n2)).Collect()`
得到的结果就是排序好的数据
#3