2013-06-13 4 views
4
package main 

type Key struct { 
    stuff1 string 
    stuff2 []string 
} 

type Val struct { 
} 

type MyMap struct { 
    map1 map[Key]*Val // compiles fine! 
} 

func main() { 
    var map2 map[Key]*Val // "invalid map key type Key" 
} 

Это правильное поведение или ошибка в go компиляторе?Правильное поведение или ошибка компилятора?

Я использую go-1.1 на Linux x64.

+1

https://code.google.com/p/go/issues/detail?id=5698 является соответствующей ошибкой на случай, если кто-то захочет следовать. – MatrixFrog

ответ

4

Компилятор прав. Из спецификаций: Map Types:

Операторы сравнения == и! = Должны быть полностью определены для операндов типа ключа; таким образом, тип ключа не должен быть функцией, картой или срезом.

Это ограничение применяется транзитивно, если тип ключа является структурой для всех полей структуры, они должны подчиняться Вышеназванные правила, а также, что

stuff2 []string 

нет.

EDIT:

Что же касается map1 не помечено, что, вероятно, является ошибка, возможно, вызвана MyMap никогда на него ссылается и, таким образом, его тип проверка была, вероятно, пропустил.

+0

спасибо, но почему не пошли жаловаться на определение map1? –

+1

@HowardGuo Рассмотрите возможность подачи ошибки. – fuz

+1

@HowardGuo: см. Обновленный ответ. Я проверю, является ли это известной проблемой, и сообщите об этом, если нет. – zzzz

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