Go语言短变量声明(Short declaration)下变量重声明的疑问
为什么Go代码里能重复短声明同名变量
phones? 嘿,这个问题其实是Go里作用域在搞鬼!你之前的理解没错——在同一个作用域里,短声明:=确实不能单独重复声明已存在的变量,必须同时声明至少一个新变量才行。但你的代码里,两个phones根本不在同一个作用域里,它们是完全独立的变量,只是碰巧名字一样罢了。
具体拆解你的代码:
第一个
phones是在main函数的顶层作用域声明的:phones := map[string]string{ "bowen": "202-555-0179", "dulin": "03.37.77.63.06", "greco": "03489940240", }它的作用范围覆盖整个
main函数(除了内部嵌套的、重新声明同名变量的作用域),类型是map[string]string。而
if语句里的phones是在if局部作用域里声明的:if phones := multiPhones[who]; len(phones) >= 2 { // ... }这里的
phones是if初始化语句中声明的变量,作用域只限于整个if块(包括花括号内的代码),类型是[]string(因为multiPhones的value是字符串切片)。
关键规则:
Go允许在嵌套作用域中声明同名变量,这个内层变量会遮蔽外层的同名变量,但两者是完全独立的实体——修改内层变量不会影响外层的,反之亦然。这和你之前了解的“同一作用域内不能单独重声明”的规则并不冲突,因为它们不在同一个作用域里。
你可以做个小测试验证:在if块里给内层phones追加元素:
if phones := multiPhones[who]; len(phones) >= 2 { fmt.Println(phones) phones = append(phones, "test") // 修改内层变量 phone = phones[1] } fmt.Println(phones) // 打印外层的map,完全不受内层修改影响
运行后你会发现,外层的phones还是原来的map,没有任何变化。
内容的提问来源于stack exchange,提问作者masa976
相关产品推荐
相关产品推荐

