Go语言变量
Go语言变量
变量声明
Go是静态类型语言,每个变量都有明确的类型。Go提供了多种声明变量的方式,适用于不同场景。
1. var 关键字声明
最基础的声明方式,显式指定类型:
var name string // 声明一个string类型变量,零值为 "" |
声明的同时赋值:
var name string = "Gopher" |
Go可以根据右侧的值自动推断类型,此时可省略类型声明:
var name = "Gopher" // 推断为 string |
2. 批量声明
当需要同时声明多个变量时,使用 var() 块可以让代码更整洁:
var ( |
3. 短变量声明 :=
函数内部最常用的声明方式,简洁高效:
func main() { |
注意:
:=只能在函数内部使用,不能用于全局变量声明。
4. 各方式对比
| 声明方式 | 适用范围 | 示例 | 特点 |
|---|---|---|---|
var name type |
全局 + 局部 | var x int |
显式类型,零值初始化 |
var name = value |
全局 + 局部 | var x = 10 |
类型推断 |
name := value |
仅局部 | x := 10 |
最简洁,函数内首选 |
零值(Zero Value)
Go中变量声明后如果不赋值,会被自动初始化为该类型的零值,不会出现”未初始化”导致的未定义行为:
| 类型 | 零值 |
|---|---|
int, float64 等数值类型 |
0 |
bool |
false |
string |
"" (空字符串) |
| 指针、切片、map、channel、函数、接口 | nil |
var count int // 0 |
局部变量与全局变量
全局变量
在函数外部、包级别声明的变量。整个包内的所有函数都可以访问:
package main |
全局变量的特点:
- 必须使用
var关键字声明(不能用:=) - 生命周期与程序一致,程序运行期间始终存在
- 首字母大写的全局变量可被其他包访问(导出),小写则为包内私有
局部变量
在函数内部声明的变量。只在该函数(或更小的作用域)内有效:
func main() { |
局部变量的特点:
- 可使用
var或:=声明 - 生命周期仅限于所在的作用域(函数、if/for块等)
- 函数执行结束后,局部变量会被垃圾回收
同名变量的遮蔽(Shadowing)
当局部变量与全局变量同名时,局部变量会遮蔽全局变量:
package main |
建议:避免局部变量与全局变量同名,防止产生难以排查的bug。可以使用
go vet -vettool配合shadow检查器来发现遮蔽问题。
完整示例
package main |
运行:
go run main.go |
输出:
Hello, Go! |
小结
| 概念 | 要点 |
|---|---|
| 声明方式 | var(全局+局部)、:=(仅局部) |
| 零值 | 未赋值的变量自动初始化为类型零值 |
| 全局变量 | 包级作用域,var 声明,首字母大小写控制可见性 |
| 局部变量 | 函数/块级作用域,推荐使用 := |
| 遮蔽 | 同名局部变量会遮蔽全局变量,应尽量避免 |
下一篇将介绍Go的常量与iota以及基本数据类型。
本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 费冰的数据视角!
评论











