免责声明:我现在只玩了一天Go,所以很有可能我错过了很多.
有没有人知道为什么在Go中没有真正支持generics/templates/whatsInAName?所以有一个泛型map,但是由编译器提供,而Go程序员不能编写自己的实现.尽管所有关于使Go尽可能正交的讨论,为什么我可以使用泛型类型但不创建新类型?
特别是在涉及函数式编程时,有lambda,甚至是闭包,但是对于缺少泛型的静态类型系统,我如何编写,以及通用的高阶函数,如filter(predicate, list)?好的,链接列表等可以interface{}牺牲类型安全性来完成.
由于对SO/Google的快速搜索没有透露任何见解,所以看起来像仿制药,如果有的话,将作为事后补充添加到Go.我确实相信Thompson比Java家伙更好,但为什么要保持泛型?或者他们是否有计划而尚未实施?
以下代码在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) 我无法掌握整个泛型声明,即使在阅读了关于Java的书籍中的无数文章和条目之后,它们似乎都没有以简单明了的方式解释它.请任何人解释我的那些?:
class Something<T> {...}
Run Code Online (Sandbox Code Playgroud)
我知道T是什么,并且我理解当我们想要为我们传入的任何类型的Object类型编写通用定义/方法时,我们使用泛型,而是具有特定于一种类型的Object扩展的不同类型的方法,我们写一个可以包括一种或多种类型的通用的(因此大写字母T).但是最让我烦恼的是下一个声明示例:
public <T extends Comparable<T>> void Something{...}
Run Code Online (Sandbox Code Playgroud)
首先; 可比较是一个接口而不是一个类(如果我错了,请纠正我)所以第一个为什么它extends不是implements.现在,为什么它必须被宣布(这整个<T ...>之前的东西)void现在和现在Comparable<T>?那是什么意思?进入的Object类型必须具有implements Comparable<T>?因此,如果我想作为类型参数传递类class Something{...}我将得到一个错误,但传递class Something implements Comparable<T>{...}会没事?请揭开我的神秘面纱:(明天我有一个考试,我不能抓住其他东西而不抓住这一个...... :(