Подтвердить что ты не робот

Go: Назначить функцию множественного возвращаемого значения новой и старой переменной

В go есть функции, которые возвращают два значения или больше значений, обычно одна из них является ошибкой. Предположим, что я хочу сохранить первое возвращаемое значение в уже инициализированную переменную, но я хотел бы инициализировать переменную, содержащую встроенную ошибку. Есть ли способ сделать это?

Например, скажем, у меня был этот код

var a int
//This code doesn't compile because err doesn't exist
a, err = SomeFuncWithTwoReturnValues()
//This code doesn't compile either
a, err := SomeFuncWithTwoReturnValues()

Я знаю, что вы могли бы это сделать, но я надеялся, что есть способ сделать это все inline

var a int
var err error
a, err = SomeFuncWithTwoReturnValues()

или

a, err := SomeFuncWithTwoReturnValues()

EDIT: приведенный выше код действительно компилируется, поэтому я снова посмотрел на свой код, чтобы развернуть больше, и создал быстрый образец, который фактически реплицирует проблему (не только в моем сознании...).

package main

func myfunc() (int, int) {
    return 1, 1
}

func main() {
    a := make([]int, 1)
    a[0], b := myfunc()
    a[0] = b
}

Компилятор говорит main.go|9| non-name a[0] on left side of :=. Если я сделаю это = вместо :=, но тогда b никогда не будет создан. У меня возникает ощущение, что нет короткого способа сделать это, хотя.

4b9b3361

Ответ 1

Как вы уже упоминали в комментариях, вам нужно использовать оператор = для назначения переменной, которую вы уже объявили. Оператор := используется для одновременного объявления и назначения переменной. Они одинаковы:

var x int
x = 5
//is the same as
x := 5

Это решение, по крайней мере, скомпилирует:

package main

func myfunc() (int, int) {
    return 1, 1
}

func main() {
    var b int
    a := make([]int, 1)
    a[0], b = myfunc()
    a[0] = b
}

Чтобы ответить на ваш вопрос, я не думаю, что существует способ одновременного использования необъявленной и объявленной переменной при возврате нескольких значений. Это будет пытаться использовать два разных оператора одновременно.

Изменить: просто увидел ваш пример из кода, который компилируется, так что, похоже, вы уже знакомы с операторами присваивания go. Я все равно оставлю этот пример.