在 Go 入门阶段,变量和常量看起来都只是“存值”的工具,但它们对应的语法约束和使用场景并不一样。本文按“先声明什么、什么时候能省类型、哪些写法有限制”的顺序梳理 Go 中变量与常量的核心规则,并结合代码示例说明你在实际编写程序时该如何判断。
变量是什么
变量用于保存程序执行过程中会变化的数据。Go 对变量名有明确要求:只能由字母、数字、下划线组成,并且只能以字母或下划线开头。
和很多静态语言一样,Go 中的变量需要先声明再使用,而且声明后的局部变量必须被使用,否则编译阶段就会报错。这一点是 Go 保持代码整洁的重要约束之一。
变量声明
最基础的写法是使用 var 声明变量,并显式写出类型。你可以声明单个变量,也可以一次声明多个变量。
// 声明单个变量,格式:var 变量名 变量类型
var name string
// 声明多个同类型变量
var name1, name2 string
// 批量声明多个不同类型的变量
var (
name3 string
age int
)
如果你已经确定变量的类型,或者需要在函数外、包级作用域中定义变量,这类 var 写法会更直接,也更适合表达“这个值后续会变化”。
变量赋值
变量声明之后,可以单独完成赋值。单个变量和多个变量都支持对应赋值。
name = "alice" // 单个赋值
name1, name2 = "bob", "jan" // 多个变量赋值
这类写法适合“先定义、后决定具体值”的场景。比如变量需要在不同分支中统一声明,或者需要先占位再根据后续逻辑赋值时,就会比较常见。
当然,你也可以把声明和赋值合并在一起完成:
// 单个变量声明并赋值
var name4 string = "alice"
// 多个同类型变量声明并赋值
var name5, name6 string = "bob", "jan"
// 多个不同类型的变量声明和赋值
var (
name7 string = "alice"
age int = 18
)
这种写法在初始化阶段更常用,代码也更紧凑。是否分开写,主要取决于变量是否需要先占位、后计算。
类型推导和简写声明怎么用
Go 的一个常见便利特性是类型推导。也就是说,在声明变量并赋值时,如果右侧的值已经足够明确,编译器就能自动推断变量类型,你不必重复写出类型名。

最常见的形式是 :=。不过这里有一个很关键的限制:这种简写只能写在函数体内,不能用于函数外的包级声明。
// 在声明变量时直接赋值,变量类型自动根据值推断其类型
// 因为值为字符串,所以name8的类型就是字符串类型
name8 := "alice"
// 多个变量赋值,自动推导name9类型为字符串,age9类型为int
name9, age9 := "alice", 18
这类写法适合局部临时变量,尤其是在函数内部快速初始化数据时非常常见。实际判断时可以简单理解为:
- 需要显式表达类型,或者不在函数体内,优先用
var。 - 在函数内部做就近声明并初始化,
:=会更顺手。
常量的规则
常量用于保存不会变化的值。它的命名规则与变量一致,但使用约束更严格:声明时必须赋值,而且赋值之后不能再修改。
这意味着,只要某个值在程序运行期间不应该发生变化,例如数学常数、固定标识、枚举项等,就更适合使用常量,而不是普通变量。
const pi float32 = 3.14 // 声明单个常量
const n1, n2 int = 0, 1 // 声明多个同类型的变量
const ( // 批量声明
m1 int = 1 // 指定类型
m2 = 2 // 不指定类型,自动推导
)
从写法上看,const 和 var 很像,也支持单个声明、同类型批量声明以及分组声明。区别在于,常量更强调“定义后不可变”,因此它更适合表达程序中的固定规则,而不是过程中的中间结果。
iota 的用法
在常量声明中,iota 是 Go 提供的自增计数器,经常用来生成一组连续的常量值。它最典型的用途,是定义一批从 0 开始递增的枚举型常量。

const (
l0 = iota // 初始值为0
l1 // l1自动递增,它的值是1
l2 // l2的值是2
)
这段代码的关键点不在于“写得更短”,而在于当你需要维护一组顺序常量时,iota 能减少手动填写数字带来的重复和出错风险。看到这类声明时,可以直接把它理解为“当前常量组里的自动编号”。
怎么选 var、const 和简写声明
把前面的规则合起来,日常开发里可以这样判断:
- 值会变,用变量;值不会变,用常量。
- 需要先声明后赋值,或处在函数体外,使用
var。 - 在函数体内直接初始化局部变量,使用
:=更简洁。 - 需要一组连续递增的常量时,使用
iota。
对于 Go 初学者来说,先把这几条边界记清楚,比死记语法更重要。因为你真正写代码时,最常遇到的问题并不是“语法会不会写”,而是“这里到底该声明变量还是常量”“能不能省类型”“这段简写为什么不能放到函数外”。把这些判断标准建立起来,后续看任何 Go 示例代码都会顺畅很多。













