为了账号安全,请及时绑定邮箱和手机立即绑定

接口实际使用所需的提示

接口实际使用所需的提示

Go
慕标5832272 2022-01-17 18:24:20
我想变得“聪明”,但目前我被困住了: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()。但是,如果你有一个指向接口的指针,那么你就不能调用它的方法。

这与您的方法的接收器类型有关。在您的示例中,*Fooimplements IDEntity,但Foo没有。所以,*Foo是一个IDEntity,但Foo不是。

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

  • 将原型更改EliminateDuplicateInSlicefunc EliminateDuplicatesInSlice(sliceIn []IDEntity) []IDEntity

  • 将传递给此函数的切片类型从更改[]*Foo[]IDEntity


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信