【发布时间】:2021-10-07 21:43:39
【问题描述】:
我无法找到以下问题的答案。
我有一个接口和一个实现它的结构。
type InterfaceA interface {
DoA()
}
type ImplementsA struct {}
func (a ImplementsA) DoA() {
fmt.Println("do A")
}
问题是:为什么我不能使用ImplementsA 的切片将其传递给一个需要可变数量的InterfaceA 参数的函数?
func UsesVariadicNumberOfA(as ...InterfaceA) {
for _, a := range as {
a.DoA()
}
}
func main() {
a1 := ImplementsA{}
a2 := ImplementsA{}
as := []ImplementsA{a1, a2}
// this does not compile, with "cannot use as (variable of type []ImplementsA) as []InterfaceA [...]"
UsesVariadicNumberOfA(as...)
// this works, of course
ais := []InterfaceA{a1, a2}
UsesVariadicNumberOfA(ais...)
}
【问题讨论】:
-
“为什么我不能使用一个 ImplementsA 的切片将它传递给一个函数,该函数需要可变数量的 InterfaceA 参数?”因为 Go 的类型系统既没有协变也没有协变。另见golang.org/doc/faq#convert_slice_of_interface。 100% 重复。