Меняет ли индексное выражение в Go свой возвращаемый тип в зависимости от контекста? - PullRequest
0 голосов
/ 07 сентября 2018

если карта содержит запись с ключом x, a [x] является элементом карты с ключом x, а тип [x] является типом элемента M

но

Индексное выражение на карте a типа map [K] V, используемое в назначении или инициализация специальной формы

v, ok := a[x]

дает дополнительный нетипизированное логическое значение.

Я все еще учусь Го. Является ли это «синтаксической функцией», которая встроена в язык и «просто работает, когда используется этот синтаксис», то есть вызовы v := a[x] и v, ok := a[x] представлены как различные типы узлов в AST, такие как MapGetAndCheckExistsNode(m, k, v, ok) против MapGet(m, k, v)? Или это реализовано с использованием "нормального" синтаксиса Go, и функция индексации каким-то образом знает, является ли его вывод "деструктурированным" или нет? Можно ли заставить индексное выражение возвращать кортеж или структуру с полями s.v и s.ok с использованием синтаксиса s := a[x]?

1 Ответ

0 голосов
/ 08 сентября 2018

Это произвольное правило как часть самого языка.Он используется, чтобы избежать паники по типам:

t, ok := x.(T)  

Или проверить, действительно ли существует ключ на карте:

v, ok := m[k]

Или проверить работоспособность получения:

x, ok := <-ch

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

...