我如何解决Go没有参数多态?

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{},在所有的代码,那么你可以使用垂直切片运营商就可以了,你可以把任何元素,但当你把他们赶出去时.

  • Clojure具有参数多态性.而且,据我所知,Common Lisp至少有某种类型的动态调度. (2认同)

小智 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竞争.

  • 只是挑剔:我不认为Go是一种系统编程语言.Go没有足够的中级语言功能或条件编译工具.而Go与其他语言不相称.Go专为编写适合在受控企业环境中运行的多线程服务器而设计和擅长.即Go是Java或Erlang的替代品,而不是C或C++.Go只与C++竞争,因为它的存在阻止了人们使用C++进行不适当的任务. (2认同)