无法将实现Foo接口的结构片传递给期望[] Foo的函数

时间:2016-12-05 17:03:56

标签: go interface

我正在尝试使用Go中的接口,但我似乎无法将实现某个接口的一片结构传递给需要接口片的函数。它适用于仅占用单个对象的函数,但不适用于期望接口切片的函数。使用下面的代码我收到以下错误:

  

./ main.go:27:不能在fooBarBar的参数中使用fooBar(类型[] * FooBar)作为类型[] Foo

以下是代码:

build/plugins

2 个答案:

答案 0 :(得分:0)

我可以尝试这种方式:

func main() {
    fooBar := []Foo{&FooBar{true}, &FooBar{false}}
    FooBarBar(fooBar)
}

GoPlayGround

答案 1 :(得分:0)

没有"子打字"在Go。

[]Foo[]*Foobar是两种不同的类型,因此您只需使用for循环将[]*Foobar转换为[]Foo

foos := []Foo{}

for _,f:=range foobar {
    foos = append(foos,f)
}

FooBarBar(foos)

或者你可以把你的* Foobar直接放在Foo片中:

foos := []Foo{&FooBar{true},&FooBar{false}}
FooBarBar(foos)

有一些例外,例如命名类型和未命名类型之间的关系

type FooBar struct{}

type Foobars []*FooBar // Foobars is an named type, []*FooBar is an unnamed type

AcceptFoobars := func(f []*FooBar) {} // Accepts Foobars too

foobars := Foobars{{}, {}, {}}
AcceptFoobars(foobars)

Go type system is" flat",没有继承或转换,只有断言和转换。由Go规范定义。

https://golang.org/ref/spec#Types

  

类型确定特定于值的值集和操作集   那种类型可以是命名的或未命名的。指定了命名类型   通过(可能合格的)类型名称;使用指定未命名的类型   一个类型文字,它从现有类型中组成一个新类型。