当前位置: 首页 > 面试题库 >

在Go中,如何将某个接口的切片传递给需要不同兼容接口的切片?

寿毅庵
2023-03-14
问题内容

我有两个接口AB。碰巧A包括B。最后,我有一个具体的实现A(称为Impl),根据定义,它也实现了B

例如:

type A interface {
    Close() error
    Read(b []byte) (int, error)
}

type Impl struct {}
func (I Impl) Read(b []byte) (int, error) {
    fmt.Println("In read!")
    return 10, nil
}
func (I Impl) Close() error {
    fmt.Println("I am here!")
    return nil
}

由于A要求Read()Impl实施A,它也令人满意io.Reader

如果我尝试跨函数传递单个项目,则效果很好。但是,如果我尝试A对Expecting函数进行切片io.Reader,它将失败。

例:

func single(r io.Reader) {
    fmt.Println("in single")
}
func slice(r []io.Reader) {
    fmt.Println("in slice")
}
im := &Impl{}

// works
single(im)

// FAILS!
list := []A{t}
slice(list)

如果我可以将传递Asingle(r io.Reader),为什么我不能传递[]Aslice(r []io.Reader),我将如何纠正它?

https://play.golang.org/p/QOREQJTQhD上的实际实现只是取消注释了最后两行,main()并且错误显示:

main.go:38: cannot use list (type []A) as type []io.Reader in argument to slice

问题答案:

我在这里问过类似的问题在Go中,如何使用切片制作泛型函数?

可悲的是,这绝对是Go中的弱点。解决此问题的唯一方法是使用[] A中的元素制作[] io.Reader类型的新切片



 类似资料:
  • 问题内容: 我有一个接口,该接口由struct实现。 要获取模型实例,我具有以下辅助函数: 上面的方法允许我返回正确类型的Person实例(以后可以使用相同的方法轻松添加新模型)。 当我尝试执行类似的操作以返回模型切片时,出现错误。码: 去抱怨: 我的目标是回到请求任何机型的切片(是否,,,W / E)。我缺少什么,如何正确实施这样的解决方案? 问题答案: 简短的答案是您是正确的。结构的片段不等于

  • 问题内容: 我正在使用的软件包gosqlite的方法带有 可变 参数,其类型为 空接口 。 如果显式传递各个参数,我可以称呼它为好: 但是,由于可变参数与我的SQL语句的运算符内的占位符相对应,因此这些占位符的数目在编译时未知,但会在运行时根据用户的操作动态变化。例如,如果用户输入四个值,我最终会得到类似于以下的SQL: 所以自然地我想用一片字符串来调用该方法: 这不会编译。我可以通过创建一个空的

  • 在第4.9小节,我们已经知道,切片实际是一个指向潜在数组的指针。我们常常需要把切片作为一个参数传递给函数是因为:实际就是传递一个指向变量的指针,在函数内可以改变这个变量,而不是传递数据的拷贝。 因此应该这样做: func findBiggest( listOfNumbers []int ) int {} 而不是: func findBiggest( listOfNumbers *[]i

  • 我正在尝试组合切片和切片。我怎么能在围棋中做到这一点? 我试过: 但是得到: 然而,文档似乎表明这是可能的,我遗漏了什么?

  • 问题内容: 我在遍历包含接口切片的接口切片时遇到麻烦。 通过尝试使用返回JSON数据的API调用产生了此问题。返回的数据很多,根据请求的不同,结构也有很大不同。API文档中也没有JSON响应的结构,因此我试图实现一些用于处理任意JSON响应的方法。 当前,当进行初始调用时,将其放入map [string] interface {}中,然后运行switch语句以确定每个元素的类型,当遇到一片接口时就

  • 问题内容: 背景:使用cgo从Golang调用C函数。 我想使用具有以下签名的C函数:。它会修改的数据和,这就是为什么它使用指针,它们的原因。的值是的长度;是一个字符串数组;返回值只是一个(布尔)指示符,用于指示是否存在错误。 在golang中,我可以使用来成功传递和修改。通过使用。示例代码如下: 如您所见,C函数当前为,但我想要的是。 这就是说:我真正想要的是在C中启用对字符串数组的修改(例如,