Возвращаемая карта, как "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)