gpt4 book ai didi

go - 实际使用接口(interface)所需的提示

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:03 26 4
gpt4 key购买 nike

我想变得“聪明”,但现在我卡住了 :D

我有不同类型的 slice ,并编写了一个函数来消除这些 slice 中的重复项。

我创建了一个接口(interface),它定义了一个返回标识符的函数。

我消除重复项的功能是针对该接口(interface)实现的。

但是在尝试编译时出现错误,我不确定如何解决这个问题。

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)

有人可以澄清一下吗?

最佳答案

与结构不同,拥有一个指向接口(interface)的指针是没有用的。您的接口(interface)必须声明 EntityID() int64,因此如果您有一个类型为 IDentity 的变量 a,那么您可以执行 a。实体 ID()。但是,如果您有一个指向接口(interface)的指针,则无法调用它的方法。

这是关于您的方法的接收器类型。在您的示例中,*Foo 实现了 IDentity,但 Foo 没有。所以,*Foo 是一个 IDentity,但 Foo 不是。

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

  • EliminateDuplicateInSlice 的原型(prototype)更改为 func EliminateDuplicatesInSlice(sliceIn []IDentity) []IDentity
  • 将传递给此函数的 slice 类型从 []*Foo 更改为 []IDentity

关于go - 实际使用接口(interface)所需的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37856984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com