go编程语言中的任何类型和实现泛型列表

时间:2011-10-12 15:34:51

标签: oop interface go

我正在尝试一点go programming language

我对Go的简单性感到兴奋,但在玩完之后我遇到了一些麻烦。

1。我知道 Go 不支持泛型和继承。 有没有办法实现通用列表?

我在考虑使用:

type Any interface { }

但是如何检查值是否为NULL 我正在寻找一些与C相当的实现

struct List {
  List* tail;
  void* head;
}

或使用代数数据类型:

data List a = Nil | Cons a (List a)


2。更高级的要求是为具有特定类型字段的对象制作一些容器?
例如,在 Scala编程语言中,我可以键入:

val List[Animal { type SuitableFood = Grass} ]

获取List Animals SuitableFood,其成员类型Grass为{{1}}

2 个答案:

答案 0 :(得分:6)

听起来就像你想要制作的是一个链表。

以下是golang附带的一个示例:
http://golang.org/pkg/container/list/

这是源代码:
http://golang.org/src/pkg/container/list/list.go

答案 1 :(得分:3)

您可以拥有interface{}类型的元素列表。你可以放入任何元素,当你把它拿出来时,你必须回到你想要的类型。这就像你在C示例中所做的那样void *;并且也喜欢Generics之前的Java中的列表,以及没有泛型的Objective-C中的列表。 Go库中的所有容器都是这样做的。

如果没有泛型,则不会对元素类型进行编译时检查。

如果您真的想要,可以通过使用反射来获取元素类型并根据预期类型进行检查,从而实现元素类型的运行时检查。但是,这可能有点过头了。