一、:= 符号引起的坑
先看一下,上面一段代码
咱们执行两个步骤
第一步:p = 10
第二步:p + 1
预期是打印 p = 11
var p int = 5func TestYu5(t *testing.T) { //1 p=10 p, err := Ten() //2 p+1 AddP() t.Log(p, err)}func Ten() (int, error) { return 10, nil}func AddP() int { return p + 1}
输入:
10
为什么不是11?
次要是 := 符号,在这里等同于 var
此时相当于,从新申请变量,在函数内TestYu5内的p,是局部变量。作用域返回是本函数。
而AddP函数里的p,用的是全局变量p
二、if,for等管制语句的作用域是{}笼罩的范畴
上面的代码,咱们
第一步 p = 10
第二步 p = 12
第三部 p = 10
咱们心愿最初的输入是10
func TestYu6(t *testing.T) { //第一步 p = 10 p, err := Ten() //第二步 p = 12 p = 12 if true { //第三部,让p从新等于10 p, err := Ten() t.Log(p, err) } //最初输入p,期望值是10 t.Log(p, err)}func Ten() (int, error) { return 10, nil}
输入:
10 <nil>12 <nil>
为什么最初的p是12 ?
因为咱们在if,用了:= 相当于在if语句里,从新申明了一个变量p,它的作用域值在if语句内。
如何正确的应用?
if true { //第三部,让p从新等于10 p, err = Ten() t.Log(p, err) }
这样就行了。此时的p,是里面函数内的p,作用域范畴是整个函数内。