是否可以在golang中将字段(而不是其值)作为参数传递?

是否可以在golang中将字段(而不是其值)作为参数传递?,go,Go,我有一个程序,它根据结构片中的不同字段创建不同的排行榜。这需要根据不同的字段对切片进行多次排序,其中逻辑中唯一变化的是要比较的字段 有没有办法通过将字段(而不是其值)作为参数传递给函数来封装这个重复的逻辑? 为了澄清,这里是我现在采取的方法的大致近似值: type Person结构{ 名称字符串 Stat1 int Stat2浮动64 } person1:=Person{“Alice”,10,2.0} person2:=Person{“Bob”,12,1.0} person3:=Person{“

我有一个程序,它根据结构片中的不同字段创建不同的排行榜。这需要根据不同的字段对切片进行多次排序,其中逻辑中唯一变化的是要比较的字段

有没有办法通过将字段(而不是其值)作为参数传递给函数来封装这个重复的逻辑?

为了澄清,这里是我现在采取的方法的大致近似值:

type Person结构{
名称字符串
Stat1 int
Stat2浮动64
}
person1:=Person{“Alice”,10,2.0}
person2:=Person{“Bob”,12,1.0}
person3:=Person{“Zach”,14,0.1}
人:=[]人{person1,person2,person3}
//基于一个字段的排序
sort.Slice(people,func(i,j int)bool{
//依赖于比较Stat1字段的比较逻辑
})
对于i,p:=范围内的人{
fmt.Println(fmt.Sprint(i+1)+“-”+p.Name+”和“+fmt.Sprint(people[i].Stat1))
}
//基于另一个字段的排序
sort.Slice(people,func(i,j int)bool{
//依赖于比较Stat2字段的比较逻辑
//但在其他方面与上面的比较逻辑相同
})
对于i,p:=范围内的人{
fmt.Println(fmt.Sprint(i+1)+“-”+p.Name+”和“+fmt.Sprintf”(%.1f),people[i].Stat2))
}
//还有很多很多。。。
理想情况下,我可以这样做(但我认为如果没有泛型,这可能是不可能的):


您所显示的代码的重复性不会从您提出的解决方案中受益。但是,您可以使用以下内容使其更加结构化:

var SortOptions = map[string]func([]Person) func(int,int)bool {
  "stat1": func(people []Person) func(int,int) bool { 
     return func(i,j int) bool { return people[i].Stat1<people[j].Stat1 }
   },
  "stat2": func(people []Person) func(int,int) bool {
     return func(i,j int) bool { return people[i].Stat2<people[j].Stat2 }
   },
}

谢谢你的建议。我喜欢这里的地图,它可以更好地组织排序方法。我肯定会认为这是一种选择。然而,我确实认为我的解决方案的一个版本可以避免重复——如果这种方法在go中是可行的话。这一点尤其正确,因为在实际程序中,比较逻辑是相同的(被比较的字段除外),并且更复杂。我会更新这个问题,让它更清楚。
var SortOptions = map[string]func([]Person) func(int,int)bool {
  "stat1": func(people []Person) func(int,int) bool { 
     return func(i,j int) bool { return people[i].Stat1<people[j].Stat1 }
   },
  "stat2": func(people []Person) func(int,int) bool {
     return func(i,j int) bool { return people[i].Stat2<people[j].Stat2 }
   },
}
sort.Slice(people,SortOptions["stat1"](people))