Как создать строку карты [[16] byte] [] в Go? - PullRequest
5 голосов
/ 26 ноября 2010

Спецификация Go сообщает :

Операторы сравнения == и! = (Операторы сравнения) должны быть полностью определены для операндов типа ключа;таким образом, тип ключа не должен быть структурой, массивом или фрагментом.Если тип ключа является типом интерфейса, эти операторы сравнения должны быть определены для значений динамического ключа;ошибка вызовет панику во время выполнения.

Я хочу создать карту значений хеш-функции, которые поступают из интерфейса Hash , который возвращает []byte, но для которогомои хеши выполняются по тому же алгоритму (таким образом я знаю, что он будет вписываться в [16]byte).Как я могу предоставить соответствующий интерфейс, чтобы тип map позволял использовать []byte или [16]byte или некоторую их оболочку в качестве ключа?

В настоящее время мое использование вызывает следующую ошибку:

dupes := make(map[[16]byte][]string)
finddups.go:55: invalid map key type [16]uint8

Обновление (март 2012 г.): Go1 допускает [16]byte в качестве типа ключа.

1 Ответ

3 голосов
/ 26 ноября 2010

A тип строки представляет набор значений строки в кодировке UTF-8.Строки ведут себя как массивы байтов.См. Правила 2 и 4 для байтовых срезов в разделе «Преобразования в и из строкового типа» в разделе Преобразования в спецификации языка Go.*

Примечание. Этот алгоритм просто использует преимущества правил для строковых типов и преобразований, приведенных в Спецификация языка Go , которой должны удовлетворять все реализации.Это «хитрость», точно так же, как var i int = '7' - '0' (для ASCII, EBCDIC, Unicode и т. Д.) Это «хитрость» для преобразования числового символа «7» в целочисленное значение 7 в Go и многих других языках.

...