【发布时间】:2017-04-12 10:06:09
【问题描述】:
我想创建一个使用接口切片的函数。
例如,我有一个接口ider,它包装了一个ID() string 函数。然后我有一个类型(Field),它实现了ider 接口。现在我有不同的对象,它们有 ider 的切片作为参数。
在我的函数中,我期望得到ider ([]ider) 的一部分。该函数应该被不同的类型使用,它们正在实现ider。
这很难描述。所以这里是一个完整的例子,输出如下错误:
不能在 inSlice 的参数中使用 myObj.Fields (type []*Field) 作为 type []ider
type ider interface {
ID() string
}
type Field struct {
Name string
}
// Implements ider interface
func (f *Field) ID() string {
return f.Name
}
type MyObject struct {
Fields []*Field
}
// uses slice of ider
func inSlice(idSlice []ider, s string) bool {
for _, v := range idSlice {
if s == v.ID() {
return true
}
}
return false
}
func main() {
fields := []*Field{
&Field{"Field1"},
}
myObj := MyObject{
Fields: fields,
}
fmt.Println(inSlice(myObj.Fields, "Field1"))
}
https://play.golang.org/p/p8PPH51vxP
我已经搜索过答案,但我只是找到了针对空接口而不是针对特定接口的解决方案。
【问题讨论】:
-
可以使用idler接口来创建“fields”变量,像这样:fields := []ider{ &Field{"Field1"},}。它在您的 go playground 链接上运行。
-
@mgagnon 是的,可以。我刚刚编辑了这个问题,因为我的问题嵌套在一个额外的类型中。
-
来自 Tim Cooper 链接,有一个参考:github.com/golang/go/wiki/InterfaceSlice 我想它会帮助你。
-
谢谢。该链接有所帮助。
标签: go