Golang Generic-ish Hashmap - PullRequest
       1

Golang Generic-ish Hashmap

0 голосов
/ 04 июня 2018

Я пытаюсь сделать обертку для go для типа map [], чтобы я мог добавить некоторые методы, такие как contains () (это почти заставляет меня скучать по java).Тем не менее, я не знаю, как я могу сделать что-то вроде обобщений в Java.

Хотя почти все, что я прочитал, говорит, что golang не имеет обобщенных типов, должен быть лучший способ, чем написать отдельныйstruct для каждой возможной комбинации структур и значений, которые я использую.

Вот что я пытаюсь сделать, даже если код не работает:

func newMap(key interface{}, val interface{}) {
    keytype := key.(type)
    valtype := val.(type)

    return hashmap{map[keytype]valtype}
}

type hashmap struct {
    hashmap     map[]
}

AnyПомощь / объяснения о том, как это сделать, была бы признательна.

РЕДАКТИРОВАТЬ: Содержит не единственное, что я пытаюсь воспроизвести, следовательно, желание сделать «универсальный» хэш-карту.replace (), isEmpty (), все эти забавные вещи.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Для создания функций, подобных содержимому для карт, вам не нужны универсальные шаблоны.Go может справиться с этим очень хорошо, есть больше способов сделать это, в зависимости от варианта использования некоторые способы могут иметь лучшую производительность.Например, вы можете написать хеш-код функции

Но есть еще кое-что, что нужно учитывать.

В Java обобщенные формы - это просто сахар кода.Во время выполнения карты или списки в Java имеют те же функции, что и в Golang.Объект, который становится видимым в действии карты, будет иметь объекты, которые принадлежат этому объекту.Это то же самое на Яве и Голанге.Таким образом, в golang у вас нет синтаксического сахара, поэтому вы должны помнить, какие объекты вы можете ожидать в картах, списках и т. Д.

Читайте здесь о синтаксическом сахаре в Java.Это поможет вам принять выбор, который сделали дизайнеры Go.

https://www.cordinc.com/blog/2010/09/java-generics-are-not-real-gen.html

0 голосов
/ 04 июня 2018

Golang, как вы говорите, не имеет универсальных шаблонов.

Но карты могут быть объявлены с использованием ваших собственных типов, поэтому вам не обязательно писать свою собственную "универсальную" хэш-карту, чтобы использовать такие вещи, как "содержит "или" пусто ".

Пример (при условии, что некоторые типы значков и цветов уже существуют, а также функция GetTheIcon, которая возвращает некоторый значок):

// this one will map Icon -> Colour
iconToColours := make(map[Icon]Colour)

myIcon := GetTheIcon()
// second return argument is true if the key was found in the map
_, iconIsContained := iconToColours[myIcon]

// check if the map is empty
isEmpty := (len(iconToColours) == 0)

Подробнеездесь:

https://blog.golang.org/go-maps-in-action

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