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 никогда не будет создан. У меня возникает ощущение, что нет короткого способа сделать это, хотя.
Ответы
Ответ 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. Я все равно оставлю этот пример.