变量、常量与作用域精要 1. 引言Go 语言的变量与常量看似简单但其中暗藏不少容易踩坑的细节。本篇围绕三种声明方式、iota 枚举、作用域规则与零值机制帮你快速掌握惯用写法避开常见的变量遮蔽陷阱。2. 三种声明方式Go 中声明变量主要有三种方式var、:和const。2.1 var 声明var是最基础的声明方式适用于包级变量、需要显式类型或先声明后赋值的场景。varnamestringGovarcountint// 零值初始化vara,bint1,22.2 短变量声明 ::是函数内最常用的声明方式由编译器推断类型简洁高效。funcmain(){name:Gocount:42}2.3 const 常量const用于声明不可修改的常量支持多种类型且可在编译期计算。constPi3.14159constMaxSize10243. 短变量声明 : 的限制:虽然方便但有以下限制只能在函数内使用包级变量不能用:必须用var。左侧至少有一个新变量如果左侧变量都已存在则必须用赋值。x:1x,y:2,3// 合法y 是新变量x4// 合法x 已存在用 4. 常量与 iota 枚举iota是 Go 中用于常量递增的预定义标识符在const块中从 0 开始逐行递增。const(Aiota// 0B// 1C// 2)iota也支持跳过和表达式运算const(_iota// 跳过 0KB1(10*iota)// 1 10 1024MB// 1 20GB// 1 30)5. 作用域规则Go 的作用域分为包级、函数级和块级遵循就近匹配原则。5.1 包级、函数级与块级packagemainvarglobal包级变量// 包级作用域funcmain(){local:函数级变量// 函数级作用域iftrue{inner:块级变量// 块级作用域fmt.Println(inner)}}5.2 变量遮蔽Shadowing变量遮蔽是 Go 中最常见的陷阱之一在内部作用域用:声明同名变量会创建新变量而非赋值。x:1iftrue{x:2// 这是新变量不是赋值fmt.Println(x)// 2}fmt.Println(x)// 16. 零值机制Go 中没有「未初始化」的变量。声明后未赋值的变量会自动获得对应类型的零值数值类型0布尔类型false字符串指针、切片、map、函数等nilvarnumint// 0varflagbool// falsevarsstring// varp*int// nil7. 易错点与常见误解:在 if/for/switch 中创建新作用域导致变量遮蔽注意内部同名变量是新变量。常量不能用:声明常量必须用const。包级变量不能用:包级只能使用var或const。未使用的局部变量会导致编译错误但包级变量不会。funcmain(){unused:1// 编译错误unused declared and not used}8. 总结掌握var、:、const的适用场景理解iota的递增规则认清作用域与零值机制是写出规范 Go 代码的基础。尤其要警惕:在嵌套作用域中造成的变量遮蔽这是面试和日常开发中最高频的易错点之一。