【问题标题】:golang: function with variadic number of interface arguments [duplicate]golang:具有可变数量接口参数的函数[重复]
【发布时间】: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% 重复。

标签: go interface variadic


【解决方案1】:

编译器的错误信息只是说出答案。

注意这个函数的参数类型是InterfaceA

func UsesVariadicNumberOfA(as ...InterfaceA) {
    for _, a := range as {
        a.DoA()
    }
}

但是使用将 ImplementsA 的类型放入其中

// type of as is []ImplementsA !!
UsesVariadicNumberOfA(as...)

只要再写一个函数,参数类型为ImplementsA就可以解决这个问题了。

【讨论】:

  • BWbwchen,这不是错字。 InterfaceA 是一个由 ImplementsA 实现的接口,所以如果它只是一个简单的单个参数而不是可变参数,它就可以正常工作。如果我有一个带有签名的函数: func UsesSingleA(a InterfaceA) {...} ... 并将它与主中使用的 a1 变量一起使用,如下所示:UsesSingleA(a1) 它会完美地工作。我的问题的答案是@bcmills 链接的内容。谢谢你,@bcmills!
  • 感谢您指出我的错,@bcmills 和 Máté-Pusztai !
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多