免责声明:我现在只玩了一天Go,所以很有可能我错过了很多.
有没有人知道为什么在Go中没有真正支持generics/templates/whatsInAName?所以有一个泛型map,但是由编译器提供,而Go程序员不能编写自己的实现.尽管所有关于使Go尽可能正交的讨论,为什么我可以使用泛型类型但不创建新类型?
特别是在涉及函数式编程时,有lambda,甚至是闭包,但是对于缺少泛型的静态类型系统,我如何编写,以及通用的高阶函数,如filter(predicate, list)?好的,链接列表等可以interface{}牺牲类型安全性来完成.
由于对SO/Google的快速搜索没有透露任何见解,所以看起来像仿制药,如果有的话,将作为事后补充添加到Go.我确实相信Thompson比Java家伙更好,但为什么要保持泛型?或者他们是否有计划而尚未实施?
我是Go新手,但我读过Go常规不会错过参数多态.每当我尝试学习一门新语言时,我都会使用L99问题列表来进行练习.
即使我尝试写一些像第一个问题一样简单(在Go中将是单个语句,取一个切片的最后一个元素),我将如何将其写为一个接受任何类型切片的函数(使用我上面引用的那个单一语句)返回该切片的最后一个元素?
我认为即使语言没有参数多态,也必须有一些惯用的"Go"方式,以便Go常规声称他们不会错过参数多态.否则,如果示例比例如列表的最后一个元素更复杂,则需要一个函数来为每个类型执行任务.
我错过了什么?
以下代码在Go中实现了一个int列表:
package main
import "fmt"
type List struct {
Head int
Tail *List
}
func tail(list List) *List {
return list.Tail
}
func main() {
list := List{Head: 1, Tail:
&List{Head: 2, Tail:
&List{Head: 3, Tail:
nil}}}
fmt.Println(tail(list).Head)
}
Run Code Online (Sandbox Code Playgroud)
问题是这只适用于int.如果我想要一个列表strings,我需要再次重新实现每个列表方法(例如tail)!这显然不实用,所以,这可以通过使用空接口来解决:
type List struct {
Head interface{} // Now works for any type!
Tail *List
}
Run Code Online (Sandbox Code Playgroud)
问题是,1.由于类型转换,这似乎要慢得多,2.它抛弃了类型安全,允许人们键入任何东西:
// This type-checks!
func main() {
list := List{Head: 123456789 , Tail:
&List{Head: "covfefe" , Tail: …Run Code Online (Sandbox Code Playgroud)