package main
import (
"fmt"
"reflect"
)
func main(){
name := "wangxb"
fmt.Println(&name)
// 1. 此处简短变量声明:age是新声明的,name前面已经声明,所以:=对name就变成了赋值
name, age := "wangxiaobo", 28
fmt.Println(&name, age)
// uid的作用域是if块
if uid:= "11"; true{
fmt.Println(&uid)
uid = "9999"
fmt.Println(&uid, reflect.TypeOf(uid))
// 2. 如何按照上面(1)的理解,下面的uid应该也只是被赋值,但是为什么if后声明的uid内存地址和下面这个不一样?
uid, u := " 1247169", false
fmt.Println(&uid, u, reflect.TypeOf(uid))
}
if true{
// 3. 如果把uid放到这里来声明,作用域也是if块
uid:= "11"
fmt.Println(&uid)
uid = "9999"
fmt.Println(&uid, reflect.TypeOf(uid))
// 和上面那个if一样(2),uid已经声明过,:=对uid只是相对于赋值操作
uid, u := " 1247169", false
fmt.Println(&uid, u, reflect.TypeOf(uid))
}
}
输出结果:
0xc82000a260
0xc82000a260 28
0xc82000a280
0xc82000a280 string
0xc82000a2b0 false string
0xc82000a2f0
0xc82000a2f0 string
0xc82000a2f0 false string
如上注释中 2 的问题:
我以为:
:= 简短声明变量会的已声明过的变量进行重新赋值,但是在示例(2)中,uid的内存地址变了
示例(3),当我把uid放到if块里面声明时,:= 对uid进行赋值时确实是一个变量,
所以,我对go的if后变量声明的作用域有些疑惑,哪位大侠清楚或者有相关资料麻烦给推荐一下
有疑问加站长微信联系(非本文作者)