go要求变量声明后必须使用,否则报错;var需显式指定类型,:=仅限函数内且须有初始值;批量声明可省略重复类型;作用域由大括号严格限定。

Go 语言里没有“先声明后使用”的宽松规则,变量一旦声明就必须被使用,否则编译直接报错 declared and not used——这是你写第一段 Go 代码时最常撞上的墙。
var 声明变量但不赋值,必须指定类型
用 var 关键字声明变量时,如果不同时赋值,就必须显式写出类型。Go 不会像 JavaScript 那样推导“空值”类型。
常见错误:写 var age 编译失败,因为类型缺失;写 var age int 才合法。
-
var name string→ 声明字符串变量,初始值为"" -
var count int→ 声明整型变量,初始值为0 -
var active bool→ 声明布尔变量,初始值为false
这种写法适合包级变量(全局变量)或需要明确类型意图的场景,比如对接 C 接口、定义常量型配置。
:= 短变量声明只在函数内有效,且必须有初始值
:= 是 Go 的快捷声明+赋值语法,但它不是“万能替代 var”的糖衣炮弹——它只能出现在函数内部,且左边变量名不能是已声明过的(除非和已有变量同作用域且至少有一个新变量)。
典型误用:age := 25 在函数外报错;name := "Alice" 后又写 name := "Bob" 报错;但 name, age := "Alice", 25 是合法的(引入新变量 age)。
-
name := "Tom"→ 类型自动推导为string -
price := 99.9→ 推导为float64(不是float32) -
isActive := true→ 推导为bool
注意::= 本质是声明,不是赋值。如果左侧变量已在当前作用域存在,且没有其他新变量,就会触发编译错误。
多个变量一起声明,类型相同可省略重复
批量声明能减少冗余,尤其在初始化一组同类型变量时。Go 允许把类型写在最后,前面变量名用逗号分隔。
例如 var a, b, c int 等价于三个独立的 var 声明,但更紧凑;而 var x, y = 1, "hello" 则分别推导为 int 和 string。
-
var x, y, z float64→ 三者都是float64,初值均为0 -
var name, email string = "Lee", "lee@example.com"→ 显式指定类型 + 初始化 -
var id, code = 1001, "ERR_01"→ 类型由右值推导,id是int,code是string
跨类型批量声明必须保证每个右值都能明确对应一个左值,不能靠“顺序猜类型”——Go 不支持 Python 那种元组解包式模糊匹配。
变量作用域决定生命周期,大括号是硬边界
Go 没有块级作用域的概念(比如 if 语句内用 var 声明的变量,在 if 外不可见),但所有用 {} 包裹的代码块都构成独立作用域。这意味着你在 for 或 if 内部用 := 声明的变量,出了大括号就彻底失效。
容易忽略的坑:循环中用 := 声明变量,本意是每次迭代新建,结果却因复用变量名导致逻辑覆盖;或者误以为 if 内声明的变量能在外部访问,实际编译不过。
for i := 0; i → <code>msg只在本次循环体内有效-
if x > 0 { y := 10 }; fmt.Println(y)→ 编译错误:y未声明 - 函数参数、返回值名也属于该函数的作用域,与内部变量同级,不冲突但也不互通
真正麻烦的不是语法多难,而是习惯从其他语言带过来的“变量可重用”“作用域模糊”思维——Go 要求你每一步都清楚变量在哪生、在哪死。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











