一 基础用法
操作 := 只能用于方法内部, 声明并初始化新的变量
v := 3
但是不能用于已声明变量赋值, 下面的做法编译器会报错误"no new variables on left side of :="
var v int = 0 v := 1
通过错误可以了解到, := 操作左边必须要有新变量, 那么多个变量初始化只需要满足左边至少有一个新变量即可
err := errors.New("error1") ret, err := test_fun()
这种做法是合法的, 因为ret是新变量, 这样就很方便了, 因为go方法经常会返回错误err, 那么在同一个方法内
只需要声明一个err变量即可
二 :=陷阱
由于:=只能用于局部变量, 那么下面的代码会发生什么情况呢?
var out int = 1 func test() { out, in := 2, 3 }
变量out的作用域包含test(), 但是实际上:= 操作会新创建新的局部变量out, 谨记!!!
那么类似情况:
func test1() { v := 1 { v := 1 } }
编译器会不会报"no new variables on left side of :="? 编译器没有报错,所以两个v是不同的变量
在go中 if for switch都可能产生特殊作用域的局部变量,在if for switch中有变量赋值时需要注意 :=
结论:
1 := 左边出现了同层作用域的局部变量,只是赋值操作,没有新生成局部变量
2 := 左边出现了上层作用域的局部变量,新生成同名局部变量并赋值
3 := 左边出现了非局部变量,生成与非局部变量同名的局部变量
有疑问加站长微信联系(非本文作者)