变量作用域的疑惑

wxb · · 83 次点击 · 开始浏览    置顶
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后变量声明的作用域有些疑惑,哪位大侠清楚或者有相关资料麻烦给推荐一下
83 次点击  
加入收藏 微博
1 回复  |  直到 2018-09-14 18:15:15
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传