实际使用接口所需的提示

时间:2016-06-16 10:47:08

标签: go interface

我想成为一个聪明的人。但是暂时我被困了: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)最为困惑。

有人可以澄清一下吗?

1 个答案:

答案 0 :(得分:2)

与struct不同,拥有指向接口的指针是没用的。您的界面必须声明EntityID() int64,因此,如果您的变量a类型为IDEntity,那么您可以执行a.EntityID()。但是,如果您有指向接口的指针,则无法调用其方法。

这是关于您的方法的接收器类型。在您的示例中,*Foo实现了IDEntity,但Foo没有实现*Foo。因此,IDEntityFoo,但EliminateDuplicateInSlice不是。

关于您的代码,您需要修改两行:

  • func EliminateDuplicatesInSlice(sliceIn []IDEntity) []IDEntity的原型更改为[]*Foo
  • 将您传递给此功能的切片类型从[]IDEntity更改为$this->request->is('post')