最近有很多关于Golang的批评,因为它不支持泛型.这到底是什么意思呢?您如何向来自Ruby等动态类型语言的人解释这一点,这不是一个熟悉的概念?
我正在学习Go,文档和互动课程说空interface可以容纳任何类型,因为它不需要额外实现的方法。
举个例子:
func describe(i interface{}) {
fmt.Printf("Type: %T | Value: %v\n", i, i)
}
Run Code Online (Sandbox Code Playgroud)
......会打印出来......
"Type: int | Value: 5" // for i := 5
"Type: string | Value: test" // for i := "test"
... etc
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是这是否Go's是实现通用功能的方式,或者是否有另一种更合适的方式来实现它们。
我正在尝试一些编程语言.
我对Go的简单性感到兴奋,但在玩完之后我遇到了一些麻烦.
1.我知道Go不支持泛型和继承.有没有办法实现通用列表?
我考虑使用:
type Any interface { }
Run Code Online (Sandbox Code Playgroud)
但是如何检查值是否为NULL.
我正在寻找一些与C相当的实现
struct List {
List* tail;
void* head;
}
Run Code Online (Sandbox Code Playgroud)
或者使用代数数据类型:
data List a = Nil | Cons a (List a)
Run Code Online (Sandbox Code Playgroud)
2.更高级的要求是为具有特定类型字段的对象制作一些容器?
例如,在Scala编程语言中,我可以键入:
val List[Animal { type SuitableFood = Grass} ]
Run Code Online (Sandbox Code Playgroud)
得到List的Animals,其中有一个成员类型SuitableFood是Grass
在Haskell中,map有类型:
map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)
请注意,a并且b不是绝对类型而是类型变量,这意味着它们可以是任何类型,只要每个变量在特定函数调用中始终引用相同类型即可.如何在Go中做同样的事情?