Go语言中的多返回值和:=

8
为什么这是一个有效的程序?
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: := 左侧没有新变量

我认为 := 不能用于更改现有变量的值?

3个回答

12

这份文档 在此处非常清晰明了:

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

该声明与已存在的变量 v 在同一作用域内(如果 v 已经在外部作用域中声明,则该声明将创建一个新的变量 §),初始化中对应的值可分配给 v,并且声明中至少还有一个其他正在新声明的变量


3

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

2

规则是左侧至少有一个变量是新的。通常情况下,您会看到在一个函数调用之后重复使用error变量的代码。

在第二个示例中,您正在重新分配两个值,因此在这种情况下,您必须在后续分配中使用=。在Go语言中,您需要经常考虑这一特定细节。不过,您会很快习惯它,它非常直观。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接