我想变得“聪明”,但目前我被困住了:D我有不同类型的切片并编写了一个函数来消除这些切片中的重复项。我创建了一个接口,它定义了一个返回标识符的函数。我的消除重复功能是针对该接口实现的。但是在尝试编译时,我得到一个错误,我不完全确定如何解决这个问题。package maintype IDEntity interface { EntityID() int64}type Foobar struct { ID int64}func (s *Foobar) EntityID() int64 { return s.ID}func EliminateDuplicatesInSlice(sliceIn []*IDEntity) []*IDEntity { m := map[int64]bool{} for _, v := range sliceIn { if _, seen := m[v.EntityID()]; !seen { sliceIn[len(m)] = v m[v.EntityID()] = true } } // re-slice s to the number of unique values sliceIn = sliceIn[:len(m)] return sliceIn}func main() { foo1 := &Foobar{ ID: 1, } foo2 := &Foobar{ ID: 2, } foo3 := &Foobar{ ID: 3, } testSlice := []*Foobar{foo1, foo2, foo2, foo3} EliminateDuplicatesInSlice(testSlice)}输出是:go run test.go# command-line-arguments./test.go:19: v.EntityID undefined (type *IDEntity is pointer to interface, not interface)./test.go:21: v.EntityID undefined (type *IDEntity is pointer to interface, not interface)./test.go:45: cannot use testSlice (type []*Foobar) as type []*IDEntity in argument to EliminateDuplicatesInSlice我最困惑的是(type *IDEntity is pointer to interface, not interface)。有人可以澄清一下吗?
1 回答
人到中年有点甜
TA贡献1895条经验 获得超7个赞
与结构不同,有一个指向接口的指针是没有用的。你的接口必须声明EntityID() int64
,所以如果你有一个a
类型的变量IDEntity
,那么你可以这样做a.EntityID()
。但是,如果你有一个指向接口的指针,那么你就不能调用它的方法。
这与您的方法的接收器类型有关。在您的示例中,*Foo
implements IDEntity
,但Foo
没有。所以,*Foo
是一个IDEntity
,但Foo
不是。
关于您的代码,您有两行需要修复:
将原型更改
EliminateDuplicateInSlice
为func EliminateDuplicatesInSlice(sliceIn []IDEntity) []IDEntity
将传递给此函数的切片类型从更改
[]*Foo
为[]IDEntity
- 1 回答
- 0 关注
- 159 浏览
添加回答
举报
0/150
提交
取消