trh*_*178 18 go parametric-polymorphism
我是Go新手,但我读过Go常规不会错过参数多态.每当我尝试学习一门新语言时,我都会使用L99问题列表来进行练习.
即使我尝试写一些像第一个问题一样简单(在Go中将是单个语句,取一个切片的最后一个元素),我将如何将其写为一个接受任何类型切片的函数(使用我上面引用的那个单一语句)返回该切片的最后一个元素?
我认为即使语言没有参数多态,也必须有一些惯用的"Go"方式,以便Go常规声称他们不会错过参数多态.否则,如果示例比例如列表的最后一个元素更复杂,则需要一个函数来为每个类型执行任务.
我错过了什么?
new*_*cct 13
你引用了"99个lisp问题",但Lisp根本没有参数多态或静态类型.
许多静态类型的语言,如Objective-C和Java之前的泛型,没有参数多态.解决方案是只使用一个可以接受所有值的类型,在Go中interface{},当需要从中获取某些特定类型时,可以使用它.
对于您的具体问题,如何采取"任何类型的切片"; 遗憾的是,没有包含特定切片的接口,因为切片没有任何方法; 所以你会被困在使用interface{}.由于您具有未知的切片类型,因此需要使用反射(reflect包)来执行所有切片操作,包括获取长度和容量,附加以及访问特定索引处的元素.
另一种方法是,而不是使用"片的任何类型的",只是用"接口的切片{}",即[]interface{},在所有的代码,那么你可以使用垂直切片运营商就可以了,你可以把任何元素,但当你把他们赶出去时.
小智 8
如何返回切片的最后一个元素的Go方法是简单地将其作为表达式内联写入.例如:
var a []int
...
last := a[len(a)-1]
Run Code Online (Sandbox Code Playgroud)
将简单表达式封装a[len(a)-1]到通用函数中是一种不必要的复杂化.
与Lisp不同,Go不是纯粹的功能语言.根据99个Lisp问题列表评估Go可能是骗人的.Go是一种"系统编程语言" - 列表操作,元编程,符号AI或其他适合Lisp的任务不是Go的强项.
我认为Go是一个改进的C,具有垃圾收集和并发性.Go不在这里与Lisp竞争.
| 归档时间: |
|
| 查看次数: |
2867 次 |
| 最近记录: |