Go 语言中的变量和常量

苏见山
苏见山
发布时间:2026-08-25 | 143人浏览过
原创

前言

在 Go 入门阶段,变量和常量看起来都只是“存值”的工具,但它们对应的语法约束和使用场景并不一样。本文按“先声明什么、什么时候能省类型、哪些写法有限制”的顺序梳理 Go 中变量与常量的核心规则,并结合代码示例说明你在实际编写程序时该如何判断。

在 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 的一个常见便利特性是类型推导。也就是说,在声明变量并赋值时,如果右侧的值已经足够明确,编译器就能自动推断变量类型,你不必重复写出类型名。

变量声明、赋值与类型推导关系图
变量写法怎么选用卡片和箭头梳理 Go 中 var、赋值与 := 的使用边界。

最常见的形式是 :=。不过这里有一个很关键的限制:这种简写只能写在函数体内,不能用于函数外的包级声明。

// 在声明变量时直接赋值,变量类型自动根据值推断其类型
// 因为值为字符串,所以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 开始递增的枚举型常量。

常量与 iota 用途示意图
常量和 iota 的区别把常量的固定值语义与 iota 的自增特性拆开说明,便于初学者快速判断使用场景。
const (
    l0 = iota // 初始值为0
    l1 // l1自动递增,它的值是1
    l2 // l2的值是2
)

这段代码的关键点不在于“写得更短”,而在于当你需要维护一组顺序常量时,iota 能减少手动填写数字带来的重复和出错风险。看到这类声明时,可以直接把它理解为“当前常量组里的自动编号”。

怎么选 var、const 和简写声明

把前面的规则合起来,日常开发里可以这样判断:

  • 值会变,用变量;值不会变,用常量。
  • 需要先声明后赋值,或处在函数体外,使用 var。
  • 在函数体内直接初始化局部变量,使用 := 更简洁。
  • 需要一组连续递增的常量时,使用 iota。

对于 Go 初学者来说,先把这几条边界记清楚,比死记语法更重要。因为你真正写代码时,最常遇到的问题并不是“语法会不会写”,而是“这里到底该声明变量还是常量”“能不能省类型”“这段简写为什么不能放到函数外”。把这些判断标准建立起来,后续看任何 Go 示例代码都会顺畅很多。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表