При попытке вернуть несколько значений в Go может показаться непонятным, почему один синтаксис допустим, а другой нет. Чтобы проиллюстрировать это, рассмотрим следующие два фрагмента кода:
func FindUserInfo(id string) (Info, bool) { it, present := all[id] return it, present }
Первый фрагмент кода действителен и возвращает значения Info и bool. Однако второй фрагмент недействителен:
func FindUserInfo(id string) (Info, bool) { return all[id] }
В связи с этим возникает вопрос, почему первый фрагмент действителен, а второй нет. Кроме того, можно задаться вопросом, есть ли способ избежать использования таких временных переменных, как this и Present.
Ключ к пониманию этого поведения лежит в ок» шаблон. В Go при доступе к карте результатом является пара значений: значение, связанное с ключом, и логическое значение, указывающее, существует ли ключ на карте. Это часто используется, чтобы отличить отсутствующий ключ от нулевого значения.
В первом фрагменте кода выражение all[id] возвращает пару значений, которые ему присвоены и присутствуют. Затем оператор return возвращает эти значения.
Компилятор играет роль в определении допустимости присваивания нескольких значений. Если функция возвращает несколько значений, но получатель слева имеет только одну переменную, компилятор выдаст ошибку. Это связано с тем, что компилятор ожидает, что количество возвращаемых значений будет соответствовать количеству получающих их переменных.
В случае второго фрагмента кода выражение return all[id] возвращает только одно значение, что несовместимо. с двумя переменными в левой части. Следовательно, компилятор сообщает об ошибке.
К сожалению, невозможно избежать использования временных переменных при возврате нескольких значений в функции Go. Это связано с тем, что компилятор требует, чтобы количество возвращаемых значений соответствовало количеству переменных, их получающих. Однако можно свести к минимуму использование временных переменных, используя именованные возвращаемые значения или возвращая структуру.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3