为什么这是一个有效的程序?
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 :=
我认为:=
不能用于将值更改为现有变量?
答案 0 :(得分:8)
此时documentation很明确:
在:=声明中,即使已经存在,也可能出现变量v 已经宣布,提供:
此声明与v的现有声明属于同一范围 (如果v已在外部范围内声明,则声明将 创建一个新的变量§),相应的值 初始化可分配给v,至少有一个其他 在声明中重新声明的变量。
答案 1 :(得分:2)
规则是左侧的至少一个变量必须是新的。您通常会看到在执行一个又一个函数调用时重用error
变量的代码。
在您的第二个示例中,您将重新分配这两个值,以便在后续分配时必须使用=
。这个特别的细节是你必须经常在Go中推论的。你很快就会习惯它,它非常直接。
答案 2 :(得分:2)
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)
}