Многократное возвращаемое значение и:= в ходу

Почему это действительная программа?

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. Вы быстро привыкаете к этому, хотя, это довольно просто.

Другие вопросы по тегам