多个返回值和:= in go

Ton*_*ony 5 go multiple-return-values

为什么这是一个有效的程序?

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)
    }

}
Run Code Online (Sandbox Code Playgroud)

这不是吗?

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)
    }

}
Run Code Online (Sandbox Code Playgroud)

抱怨说 ./main.go:18: no new variables on left side of :=

我以为:=不能用来改变现有变量的值?

Jua*_*doy 9

此时文档很清楚:

在:=声明中,即使已经声明变量v,也可能出现变量v,前提是:

此声明与v的现有声明在同一范围内(如果v已在外部作用域中声明,声明将创建一个新变量§),初始化中的相应值可赋予v,并且至少存在声明中另一个被重新声明的变量.