Возвращаемая карта, как "ok" в Golang на нормальных функциях
в Go, следующие работы (обратите внимание, что одно использование карты имеет один возврат, другой имеет два возврата)
package main
import "fmt"
var someMap = map[string]string { "some key": "hello" }
func main() {
if value, ok := someMap["some key"]; ok {
fmt.Println(value)
}
value := someMap["some key"]
fmt.Println(value)
}
однако, я понятия не имею, как сделать то же самое с моей собственной функции. Возможно ли подобное поведение с необязательным возвратом, например map
?
например:
package main
import "fmt"
func Hello() (string, bool) {
return "hello", true
}
func main() {
if value, ok := Hello(); ok {
fmt.Println(value)
}
value := Hello()
fmt.Println(value)
}
не будет компилироваться (из-за ошибки multiple-value Hello() in single-value context
) ... есть ли способ заставить этот синтаксис работать для функции Hello()
?
1 ответов
map
отличается тем, что это встроенный тип, а не функция. 2 формы доступа к элементу a map
указан Go Спецификация Языка: Индексные Выражения.
С функциями, вы не можете сделать это. Если функция имеет 2 возвращаемых значения, вы должны "ожидать" оба из них или ни одного вообще.
однако вам разрешено присваивать любое из возвращаемых значений пустым идентификатор:
s, b := Hello() // Storing both of the return values
s2, _ := Hello() // Storing only the first
_, b3 := Hello() // Storing only the second
вы также можете не хранить ни одно из возвращаемых значений:
Hello() // Just executing it, but storing none of the return values
Примечание: Вы также можете назначить оба возвращаемых значения пустому идентификатору, хотя он не используется (кроме проверки того, что он имеет ровно 2 возвращаемых значения):
_, _ = Hello() // Storing none of the return values; note the = instead of :=
вы также можете попробовать их на Go Playground.
вспомогательную функцию
если вы используете его много раз и вы не хотите использовать пустой идентификатор, создайте вспомогательную функцию, которая отбрасывает 2-е возвращаемое значение:
func Hello2() string {
s, _ := Hello()
return s
}
и теперь вы можете сделать:
value := Hello2()
fmt.Println(value)