接口实际使用所需的提示

我想变得“聪明”,但目前我被困住了: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)。


有人可以澄清一下吗?


慕标5832272
浏览 160回答 1
1回答

人到中年有点甜

与结构不同,有一个指向接口的指针是没有用的。你的接口必须声明EntityID() int64,所以如果你有一个a类型的变量IDEntity,那么你可以这样做a.EntityID()。但是,如果你有一个指向接口的指针,那么你就不能调用它的方法。这与您的方法的接收器类型有关。在您的示例中,*Fooimplements IDEntity,但Foo没有。所以,*Foo是一个IDEntity,但Foo不是。关于您的代码,您有两行需要修复:将原型更改EliminateDuplicateInSlice为func EliminateDuplicatesInSlice(sliceIn []IDEntity) []IDEntity将传递给此函数的切片类型从更改[]*Foo为[]IDEntity
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go