作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有多个结构:
type FooStruct struct {
ID int
Field1 int
CommonID int
}
type BarStruct struct {
ID int
Field2 int
CommonID int
}
type FighterStruct struct {
ID int
Field3 int
CommonID int
}
1- 它们都被保存在不同的 slice 中: sliceOfFooStruct 、 sliceOfBarStruct 、 sliceofFighterStruct
var commonSlice []interface{}
片
sort.Slice(commonSlice, func(i, j int) bool { return commonSlice[i].CommonID > commonSlice[j].CommonID })
但我得到了错误
commonSlice[i].CommonID undefined (type interface {} is interface with no methods)
我也尝试过在做 commonSlice[i].CommonID.(int) 的情况下强制转换类型,但它也不起作用。
最佳答案
由于您的 commonSlice
的元素类型是 interface{}
您无法访问值的任何字段,因为它允许存储任何值,甚至是非结构的值。
一种不鼓励的方法是使用反射来访问 CommonID
场,但这又丑又慢。作为引用,它的外观如下:
all := []interface{}{
FooStruct{11, 22, 31},
BarStruct{21, 32, 33},
FighterStruct{21, 32, 32},
}
sort.Slice(all, func(i, j int) bool {
commonID1 := reflect.ValueOf(all[i]).FieldByName("CommonID").Int()
commonID2 := reflect.ValueOf(all[j]).FieldByName("CommonID").Int()
return commonID1 > commonID2
})
fmt.Println(all)
此输出(在
Go Playground 上尝试):
[{21 32 33} {21 32 32} {11 22 31}]
而是创建一个接口(interface)来描述访问
CommonID
的方法。 field :
type HasCommonID interface {
GetCommonID() int
}
并让你的 struts 实现这个接口(interface):
func (f FooStruct) GetCommonID() int { return f.CommonID }
func (b BarStruct) GetCommonID() int { return b.CommonID }
func (f FighterStruct) GetCommonID() int { return f.CommonID }
并将您的值存储在此接口(interface)的一部分中:
all := []HasCommonID{
FooStruct{11, 22, 31},
BarStruct{21, 32, 33},
FighterStruct{21, 32, 32},
}
然后你可以使用
GetCommonID()
在
less()
中访问它的方法功能:
sort.Slice(all, func(i, j int) bool {
return all[i].GetCommonID() > all[j].GetCommonID()
})
这将输出相同,请在
Go Playground 上尝试.
type Common struct {
CommonID int
}
func (c Common) GetCommonID() int { return c.CommonID }
type FooStruct struct {
ID int
Field1 int
Common
}
type BarStruct struct {
ID int
Field2 int
Common
}
type FighterStruct struct {
ID int
Field3 int
Common
}
注:
GetCommonID()
仅定义一次,用于
Common
,其他类型不需要添加。然后使用它:
all := []HasCommonID{
FooStruct{11, 22, Common{31}},
BarStruct{21, 32, Common{33}},
FighterStruct{21, 32, Common{32}},
}
sort.Slice(all, func(i, j int) bool {
return all[i].GetCommonID() > all[j].GetCommonID()
})
输出是一样的,试试
Go Playground .
Common
) 中扩展公共(public)字段和方法列表,而无需进一步重复。
关于go - 如何对具有共同字段的空接口(interface) slice 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338244/
所以,我有一个类似于 this one 的用例,但我觉得有一些额外的细节值得提出一个新问题。 ( related questions ,供引用) 我正在编写一个实现 a cycle 的数据结构.基本设
我正在使用 Django 编写一个社交网络应用程序,需要实现类似于 Facebook“Mutual Friends”概念的功能。我有一个像这样的简单模型: class Friend(models.Mo
我有一个 iOS 应用程序,用户可以在其中使用 Facebook 登录并授予 user_friends 权限。从 Graph API 2.0 开始,Facebook 声称你无法获取两个人之间所有的共同
我想知道将来对我来说最简单的方法是什么,可以使查询既有效又不那么复杂。 我应该像这样保存双向关系吗 from_id=1, to_id=2from_id=2, to_id=1 或者只创建一个唯一的行 f
我是一名优秀的程序员,十分优秀!