假设有如下伪代码:
```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本身不建议这么做的话希望大神们能告诉我
如果有知道的大神能解答这个问题,真是感激不尽
如果比较懒懒得打代码告诉我怎么解决,如果能提供两个解决这个问题的关键字,我也是十分感激的
谢谢
刚才的代码错了,手机码字请见谅
```
stream.Of(12,94,61,98,13,37,15)
.Sort(func(n1,n2 int)bool{
return n1<n2
}).Collect()
```
对象集合的话可以这样
```
type person struct {
name string
age int
}
stream.Sort(func(p1, p2 person) bool {
return p1.age < p2.age
}).Collect()
```
#4
更多评论
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