我正在尝试使用Go中的接口,但我似乎无法将实现某个接口的一片结构传递给需要接口片的函数。它适用于仅占用单个对象的函数,但不适用于期望接口切片的函数。使用下面的代码我收到以下错误:
./ main.go:27:不能在fooBarBar的参数中使用fooBar(类型[] * FooBar)作为类型[] Foo
以下是代码:
build/plugins
答案 0 :(得分:0)
我可以尝试这种方式:
func main() {
fooBar := []Foo{&FooBar{true}, &FooBar{false}}
FooBarBar(fooBar)
}
答案 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
类型确定特定于值的值集和操作集 那种类型可以是命名的或未命名的。指定了命名类型 通过(可能合格的)类型名称;使用指定未命名的类型 一个类型文字,它从现有类型中组成一个新类型。