Golang如何理解const与var关键字区别

来源:站长源码作者:梦乃头衔:网络博主
导读:本期聚焦于小伙伴创作的《Golang如何理解const与var关键字区别》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Golang如何理解const与var关键字区别》有用,将其分享出去将是对创作者最好的鼓励。

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

Golang如何理解const与var关键字区别

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
}

Golangconstvar常量变量修改时间:2026-07-11 03:00:23

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。