Многократное возвращаемое значение и:= в ходу
Почему это действительная программа?
package main
import "fmt"
func giveMeError(limit int) ([]string, error) {
return nil, fmt.Errorf("MY ERROR %d", limit)
}
func main() {
res1, err := giveMeError(1)
if err == nil {
fmt.Println("res", res1)
} else {
fmt.Println("err", err)
}
res2, err := giveMeError(5)
if err == nil {
fmt.Println("res", res2)
} else {
fmt.Println("err", err)
}
}
А это не так?
package main
import "fmt"
func giveMeError(limit int) ([]string, error) {
return nil, fmt.Errorf("MY ERROR %d", limit)
}
func main() {
res, err := giveMeError(1)
if err == nil {
fmt.Println("res", res)
} else {
fmt.Println("err", err)
}
res, err := giveMeError(5)
if err == nil {
fmt.Println("res", res)
} else {
fmt.Println("err", err)
}
}
Жалуется что ./main.go:18: no new variables on left side of :=
я думал :=
нельзя использовать для изменения значения в существующих переменных?
3 ответа
Документация ясна на данный момент:
В объявлении:= переменная v может появиться, даже если она уже была объявлена, при условии:
эта декларация находится в той же области видимости, что и существующая декларация v (если v уже объявлена во внешней области видимости, объявление создаст новую переменную §), соответствующее значение в инициализации присваивается v, и по крайней мере еще одна переменная в объявлении, которая объявляется заново.
klashxx уже ответил на вопрос.
Здесь может быть что-то запутанное.
package main
import "fmt"
func main(){
a, b := 1, 2
fmt.Println(a, b)
{
b, c := 100, 200 //NOTE: b here is a new variable
fmt.Println(a, b, c)
}
fmt.Println(a, b)
b, c := 1000, 2000
fmt.Println(a, b, c)
}
Правило таково, что хотя бы одна из переменных слева должна быть новой. Вы обычно увидите код, который использует error
переменная при выполнении одного вызова функции за другим.
Во втором примере вы переназначаете оба значения, поэтому в таком случае вы должны использовать =
при последующем назначении. Именно об этой детали вы должны часто размышлять в Go. Вы быстро привыкаете к этому, хотя, это довольно просто.