我想成为一个聪明的人。但是暂时我被困了:D
我有不同类型的切片,并编写了一个函数来消除这些切片中的重复。
我创建了一个接口,它定义了一个返回标识符的函数。
我的消除重复的功能是针对该接口实现的。
但是在尝试编译时,我得到一个错误,我不能完全确定如何解决这个问题。
package main
type 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)
最为困惑。
有人可以澄清一下吗?
答案 0 :(得分:2)
与struct不同,拥有指向接口的指针是没用的。您的界面必须声明EntityID() int64
,因此,如果您的变量a
类型为IDEntity
,那么您可以执行a.EntityID()
。但是,如果您有指向接口的指针,则无法调用其方法。
这是关于您的方法的接收器类型。在您的示例中,*Foo
实现了IDEntity
,但Foo
没有实现*Foo
。因此,IDEntity
是Foo
,但EliminateDuplicateInSlice
不是。
关于您的代码,您需要修改两行:
func EliminateDuplicatesInSlice(sliceIn []IDEntity) []IDEntity
的原型更改为[]*Foo
[]IDEntity
更改为$this->request->is('post')