题目
Go语言中变量的零值是什么?
信息
- 类型:问答
- 难度:⭐
考点
变量声明,零值机制,基本数据类型
快速回答
在Go语言中,声明但未显式初始化的变量会被自动赋予其类型的零值:
- 数值类型(int/float等):
0 - 布尔类型:
false - 字符串类型:
""(空字符串) - 指针、接口、函数等:
nil
1. 原理说明
Go语言的设计哲学要求变量必须具有确定的值。当变量声明时未显式初始化,编译器会自动赋予其类型的零值(Zero Value)。这确保了程序不会出现未定义行为,提高了安全性。
2. 代码示例
package main
import "fmt"
func main() {
// 基本类型示例
var i int
var f float64
var b bool
var s string
// 复合类型示例
var p *int
var slice []int
var m map[string]int
fmt.Println("int:", i) // 0
fmt.Println("float64:", f) // 0
fmt.Println("bool:", b) // false
fmt.Println("string:", "\""+s+"\"") // ""
fmt.Println("pointer:", p) // <nil>
fmt.Println("slice:", slice) // []
fmt.Println("map:", m) // map[]
}3. 最佳实践
- 显式初始化:对于需要非零初始值的场景(如计数器从1开始),务必显式赋值
- 利用零值:合理利用零值特性简化代码(如
var sum int直接用于累加) - 结构体字段:结构体中的未初始化字段同样遵循零值规则
4. 常见错误
- 空指针解引用:未初始化的指针为
nil,直接使用会导致 panicvar p *int; *p = 5 // panic: nil pointer dereference - 误判空切片:零值切片
[]int{}是有效空切片,但len=0,需用len(s)==0判断而非s == nil
5. 扩展知识
- 自定义类型:用户定义的类型(如
type MyInt int)零值仍是基础类型的零值 - 零值初始化时机:全局变量在程序启动时初始化,局部变量在函数执行时初始化
- 与其它语言对比:C/C++ 未初始化变量值随机,Java 类成员有零值但局部变量必须显式初始化