Вернуть карту, как "ok" в Голанге, при нормальных функциях

В 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 формы доступа к элементу map задаются Спецификация языка перехода: выражения индекса.

С помощью функций вы не можете этого сделать. Если функция имеет 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

Примечание: вы можете также присвоить оба возвращаемых значения пустому идентификатору, хотя он не имеет смысла (кроме проверки того, что он имеет ровно два значения возврата):

_, _ = Hello()     // Storing none of the return values; note the = instead of :=

Вы также можете попробовать их на Go Playground.

Функция помощника

Если вы используете его много раз и не хотите использовать пустой идентификатор, создайте вспомогательную функцию, которая отбрасывает второе возвращаемое значение:

func Hello2() string {
    s, _ := Hello()
    return s
}

И теперь вы можете сделать:

value := Hello2()
fmt.Println(value)