Сложные типы данных как ключи на картах в Go - PullRequest
10 голосов
/ 10 ноября 2011

Я пытаюсь создать карту в Go, которая снабжена большими целыми числами.В Effective Go прямо сказано, что:

Структуры, массивы и фрагменты не могут использоваться в качестве ключей карты, поскольку для этих типов равенство не определено.

, что имеет смысл.Конечно, я мог бы преобразовать большие целые числа в строки и использовать строку в качестве ключа, но я ищу здесь более общее решение.Могу ли я обернуть мою структуру во что-то (интерфейс?), Который реализует функцию равенства, и использовать ее вместо этого?

Пример кода, который, конечно, не работает:

package main                                                                                                           

import (                                                                                                               
        "big"                                                                                                          
        "fmt"                                                                                                          
)                                                                                                                      

func main() {                                                                                                          
        one1 := big.NewInt(1)                                                                                          
        one2 := big.NewInt(1)                                                                                          

        hmap := make(map[*big.Int] int)                                                                                
        hmap[one1] = 2                                                                                                 
        _, exists := hmap[one2]                                                                                        
        fmt.Printf("Exists=%v\n", exists)                                                                              
}                                                                                                                      

1 Ответ

8 голосов
/ 10 ноября 2011

Правила о равенстве скоро изменятся.Из плана Go 1 :

Go 1 определит равенство для значений структуры и массива, составленных из полей, для которых также определено равенство (поэлементное сравнение).Это удалит равенство по функциям и значениям карты, за исключением сравнения с nil.Go 1 продолжит исключать равенство для срезов.(В общем случае это недопустимо.)

Однако, даже с этими правилами, вы не можете использовать *BigInt в качестве ключа, так как он содержит фрагмент.Также обратите внимание, что в Go невозможно написать пользовательский оператор равенства (также невозможно переопределить любой другой оператор).Но на самом деле это сильная сторона Go, без нее все просто.

Итак, вам придется использовать строки для ваших ключей.Однако строки не нужно форматировать в десятичном (или любом другом формате) формате, если вы не хотите их печатать.Поэтому, возможно, самый быстрый способ - использовать метод Bytes() (который также отбрасывает знак, обязательно включите его отдельно в строку).

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