2015-12-13 1 views
4

Как получить доступ к значению карты для следующего кода? Фрагмент кода генерируется автоматически, поэтому я не могу его изменить. Я пробовал OpType_name[OpType_UNKNOWN], но я получаю ошибку от компилятора golang.Как получить доступ к значениям карты в GO?

type OpType int32 

const (
    OpType_UNKNOWN OpType = 0 
    OpType_CREATE OpType = 1 
    OpType_DELETE OpType = 3 
) 

var OpType_name = map[int32]string{ 
    0: "UNKNOWN", 
    1: "CREATE", 
    2: "DELETE", 
} 
var OpType_value = map[string]int32{ 
    "UNKNOWN": 0, 
    "CREATE": 1, 
    "DELETE": 2, 
} 

Ошибка: cannot use int(api.OpType_UNKNOWN) (type int) as type int32 in map index

ответ

6

Go очень строго по типам. У ваших карт все ключи с типом int32, и вы пытаетесь получить к ним доступ, используя значение типа OpType. Не имеет значения, что OpType - это int32.

Вы можете отдать свой OpType в Int32 и заставить его работать

func main() { 
    fmt.Println(OpType_name[int32(OpType_UNKNOWN)]) 
} 

Комментарий от @nos хороший путь, это, вероятно, что вы хотите в этом случае.

https://play.golang.org/p/dum5GiB3zS

+4

В качестве альтернативы, сделать использование карты OpType вместо int32, 'карта [OpType] строку {' – nos

+1

Я думаю, что это стоит делать немного придирок: 'OpType' не' int32': он разделяет только внутреннее представление значений своего типа с помощью 'int32'. Важнейшим моментом является то, что 'type B A' не делает' B' "наследовать" любые методы 'A'. Это не имеет значения для 'int32', у которого нет методов, но важно знать, когда имеете дело с настраиваемыми типами. – kostix

+1

Я имею в виду, что именно поэтому Go разрешает преобразование типов из 'int32' в' OpType' (внутреннее представление значения одинаков), но не позволяет присвоить значение 'OpType' получателю типа 'int32': если это будет разрешено, получатель может захотеть вызвать метод, определенный для его типа, но переданное ему значение не будет иметь его (другого) типа. – kostix

Смежные вопросы