Любой тип и реализация универсального списка на языке программирования Go - PullRequest
3 голосов
/ 12 октября 2011

Я пытаюсь немного перейти на язык программирования .

Я взволнован простотой 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

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

Звучит так, как будто вы пытаетесь создать связанный список.

Вот пример списка, включенного в golang:
http://golang.org/pkg/container/list/

А вот и исходный код:
http://golang.org/src/pkg/container/list/list.go

3 голосов
/ 13 октября 2011

Вы можете иметь список элементов типа interface{}.Вы можете вставить любые элементы, и когда вы получите их, вы должны привести к нужному типу.Это похоже на то, что вы делаете void * в вашем примере на C;а также как списки в Java до Generics и в Objective-C, которые не имеют обобщений.Все контейнеры в библиотеке Go делают это.

Без обобщений нет проверки типов элементов во время компиляции.

Если вы действительно хотите, вы можете реализовать проверки во время выполнениятип элемента, используя отражение для получения типов элементов и проверки их относительно ожидаемого типа.Тем не менее, это, вероятно, излишне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...