Как получить доступ к отдельным значениям из функции возврата нескольких значений? - PullRequest
2 голосов
/ 23 ноября 2011

Функции Go могут возвращать несколько значений:

func f() (int, int) {
    return 2, 3
}

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

func g(i int) {...}

Есть ли более простой способ написать следующие две строки?

_, i = f()
g(i)

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011

Моим личным фаворитом будет g(f()[1]), но это тоже невозможно.

Текущее решение, используемое стандартной библиотекой, заключается в написании простых вспомогательных функций, которые отбрасывают нежелательные возвращаемые значения. Например, взгляните на пакет template .

Многие функции возвращают кортеж (*Template, os.Error), но есть помощник по имени template.Must(), который возвращает *Template и вызывает панику, если ошибка не равна нулю.

В качестве альтернативы может помочь общая вспомогательная функция, такая как func extract(index int, values ...interface{}) interface{}. Но поскольку нет поддержки дженериков, я бы не стал писать что-то подобное.

0 голосов
/ 27 февраля 2013

Использовать анонимную структуру вместо нескольких возвращаемых значений.

func f() (struct{i,j int}) {
    return struct{i, j int}{2, 3}
}

func g(i int) { ... }

func main() {
    g(f().j)
}

Конечно, это работает только тогда, когда вы пишете функцию. Хотя вы можете обернуть существующие, если хотите.

0 голосов
/ 23 ноября 2011

Нет более простого пути.

Возможное решение будет выглядеть, например, так:

g(f().1)

В Go нет синтаксической поддержки для подобной функции.

0 голосов
/ 23 ноября 2011
g(func(fst,snd int) int { return snd }(f()))

или определенный snd

func snd(x, y int) int {
    return y
}
g(snd(f()))

или если функция возвращает массив

func f() ([2]int) {
    return [2]int{2, 3}
}
g(f()[1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...