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

对于Go中缺乏数组/切片协方差的任何明智解决方案?

拓拔野
2023-03-14
问题内容

我刚刚面临的问题是在以下情况下该怎么办:

func printItems(header string, items []interface{}, fmtString string) {
  // ...
}

func main() {
  var iarr = []int{1, 2, 3}
  var farr = []float{1.0, 2.0, 3.0}
  printItems("Integer array:", iarr, "")
  printItems("Float array:", farr, "")
}

Go没有泛型,也不允许使用集合协方差:

prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument      
prog.go:27: cannot use farr (type []float) as type []interface { } in function argument

有想法吗?


问题答案:

没有任何一种,现在真的没有办法做到这一点

  1. 使您[]int[]float双方都进入[]interface{}
  2. 使printItems接受interface{}而不是[]interface{}使用,然后使用反射,类似于fmt包所做的事情。

两种解决方案都不是很漂亮。



 类似资料:
  • 我知道没有Siri的API。看起来也没有迹象表明它会很快改变。 但我迫不及待地想利用它良好的自由言论识别能力,所以我想也许仍然使用它,但作为一个“黑匣子”? 例如,该应用程序似乎能够让Siri听到并理解文本,然后将其发布到他们的网站上。知道它是怎么工作的吗? 解决Siri缺乏API的可能方法的想法?

  • 问题内容: 谁能解释我,编程语言理论中协变和逆变的概念吗? 问题答案: 协方差 非常简单,最好从某些收集类的角度来考虑。我们可以 参数化 的一些类型参数类。也就是说,我们的列表包含some 类型的元素。如果,列表将是协变的 S是Tiff列表的子类型List [S]是List [T]的子类型 (在这里,我使用数学定义 iff 表示 当且仅当 。) 也就是说,a 是一个 。如果有一些例程接受a 作为参

  • 我正在学习Scala中的函数式编程原理,在学习子类型和泛型时,我对协方差有一个困惑: 给定:或是的子类型 编辑: 下面是的定义:

  • 问题内容: 请显示一个有关Java中协方差和逆方差的好例子。 问题答案: 协方差: Sub#getSomething是协变的,因为它返回Super#getSomething的返回类型的子类(但完全填充了Super.getSomething()的协定) 逆差 Sub#doSomething是互变的,因为它采用了Super#doSomething的参数的超类的参数(但是,再次填充了Super#doSo

  • 问题内容: 协方差(大致)是在使用它们的复杂类型中 镜像 “简单”类型的 继承 的能力。 例如,我们始终可以将的实例视为的实例。如果ComplexType是协变的,则可以将A 视为a 。 我想知道:协方差的“类型”是什么,它们与C#有什么关系(是否支持它们?) 代码示例将很有帮助。 例如,一种类型是Java支持的 返回类型covariance ,但C#不支持。 我希望有功能编程知识的人也能加入!

  • 问题内容: 假设我有以下长度为3的整数数组: 然后我只抓了前两个项目 在这两种情况下,调用numSlice和nums都会产生3,分别产生2和3。 如果我随后附加到该slice(),则基础数组()现在为。两者的值均保持为3,因为切片的基础数组相同,并且切片的len现在为3。 但是,如果我再次追加到该片(),则该片的基础数组必须更改- 我们看到的情况是,现在numSlice增加了一倍,而len现在是4