在Golang的开发过程中,const和var是两个最基础的关键字,分别用于定义常量和变量,两者的核心差异体现在值的不可变性、内存分配逻辑以及适用场景等多个方面,理解这些差异是写出规范Golang代码的基础。

const与var的核心定义差异
const用于定义常量,常量在定义后值不可被修改,且必须在定义时完成初始化,不能先声明后赋值。而var用于定义变量,变量的值可以在后续代码中修改,支持先声明后赋值,也支持定义时直接初始化。
下面通过一个简单的示例展示两者的基础定义语法:
package main
import "fmt"
// 使用const定义常量,必须初始化,后续不能修改
const PI = 3.1415926
// 使用var定义变量,可以先声明不初始化,后续再赋值
var appName string
func main() {
// 变量后续可以修改值
appName = "demo"
fmt.Println(PI)
fmt.Println(appName)
// 下面的代码会编译报错,因为常量不能修改
// PI = 3.14
}
值可变性对比
值的可变性是const和var最直观的区别,const定义的常量一旦初始化完成,整个程序运行周期内值都不会发生变化,尝试修改常量的值会直接导致编译错误。而var定义的变量在作用域内可以随时修改值,没有限制。
我们可以通过下面的代码验证这个特性:
package main
import "fmt"
const MAX_COUNT = 100
var currentCount int
func main() {
currentCount = 10
fmt.Println("初始currentCount:", currentCount)
// 修改变量值是允许的
currentCount = 20
fmt.Println("修改后的currentCount:", currentCount)
// 尝试修改常量会编译报错
// MAX_COUNT = 200
}
内存分配逻辑差异
const定义的常量在编译阶段就会被直接替换为对应的值,不会在运行时分配额外的内存空间,属于编译期常量。而var定义的变量会在运行时分配对应的内存空间,存储变量的值,变量的地址可以被获取。
下面的示例可以体现两者的内存分配差异:
package main
import "fmt"
const FIXED_VALUE = 50
var dynamicValue int = 50
func main() {
// 变量可以获取内存地址
fmt.Printf("dynamicValue的地址: %pn", &dynamicValue)
// 常量不能获取地址,下面的代码会编译报错
// fmt.Printf("FIXED_VALUE的地址: %pn", &FIXED_VALUE)
}
支持的数据类型差异
const支持的常量类型包括基础数据类型(数值、字符串、布尔值),以及编译期可以确定值的常量表达式,不支持定义切片、映射、结构体等需要运行时初始化的类型。而var可以定义任意Golang支持的数据类型,包括引用类型、自定义结构体等。
相关示例如下:
package main
import "fmt"
// const不能定义切片类型,下面的代码会编译报错
// const arr = []int{1,2,3}
// var可以定义切片类型
var arr = []int{1,2,3}
// const可以定义字符串常量
const name = "golang"
// const可以定义布尔常量
const isOpen = true
func main() {
fmt.Println(arr)
fmt.Println(name)
fmt.Println(isOpen)
}
使用场景区分
在实际开发中,我们可以根据需求选择使用const还是var:
- 如果某个值在程序运行周期内不会发生变化,比如数学常数、配置中的固定参数、错误码等,优先使用const定义,既可以避免误修改,也能减少运行时的内存开销。
- 如果某个值需要在程序运行过程中被修改,或者值的类型是需要运行时初始化的引用类型、自定义类型,就使用var定义。
常见使用误区
很多开发者会犯两个常见的错误:一是在需要固定值的场景下使用var,导致值被意外修改;二是在const中定义需要运行时计算的值,比如函数调用的返回值,这会导致编译错误,因为const只支持编译期可确定的常量表达式。
下面的错误示例可以帮大家避坑:
package main
import "time"
// 错误:const不能定义函数调用返回的值,time.Now()是运行时计算的
// const now = time.Now()
// 正确:使用var定义运行时获取的值
var now = time.Now()
func main() {
// 错误:尝试修改const定义的常量
// const a = 10
// a = 20
}