全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-13 5 分钟 ✍️ juanwangdev

Go零值机制

Go变量声明后自动初始化为类型的零值,无需手动初始化。

各类型零值

数值类型零值

Go
var i int     // 0
var f float64 // 0.0
var c complex128 // 0+0i

fmt.Println(i)  // 0
fmt.Println(f)  // 0

布尔类型零值

Go
var b bool  // false

fmt.Println(b)  // false

字符串类型零值

Go
var s string  // ""(空字符串)

fmt.Println(s)     // ""
fmt.Println(len(s)) // 0

指针类型零值

Go
var p *int  // nil

fmt.Println(p)  // nil
fmt.Println(p == nil)  // true

复合类型零值

Go
// 数组
var a [5]int      // [0, 0, 0, 0, 0]

// slice
var s []int       // nil

// map
var m map[string]int // nil

// channel
var ch chan int   // nil

// 函数
var f func()      // nil

// interface
var i interface{} // nil

// struct
var u User        // 所有字段零值

结构体零值

所有字段零值

Go
type User struct {
    Name string
    Age  int
    Admin bool
}

var u User
fmt.Println(u.Name)  // ""
fmt.Println(u.Age)   // 0
fmt.Println(u.Admin) // false

指针字段零值

Go
type Config struct {
    Name  string
    Data  *Data
}

var c Config
fmt.Println(c.Name)  // ""
fmt.Println(c.Data)  // nil

零值类型表

类型零值
int, float等0
boolfalse
string""
指针nil
slicenil
mapnil
channelnil
函数nil
interfacenil
数组所有元素零值
struct所有字段零值

nil与零值

nil是特定类型的零值

Go
// nil是以下类型的零值:
// 指针、slice、map、channel、函数、interface

var p *int = nil
var s []int = nil
var m map[int]int = nil
var ch chan int = nil
var f func() = nil
var i interface{} = nil

nil不能直接使用

Go
var m map[string]int  // nil map

m["key"] = 1  // panic! nil map不能写入

// 正确:先初始化
m = make(map[string]int)
m["key"] = 1  // OK
Go
var s []int  // nil slice

s[0] = 1  // panic! nil slice不能索引写入

// 正确:先初始化
s = make([]int, 1)
s[0] = 1  // OK

nil slice/map可以读取(返回零值),但不能写入。

零值的优点

避免未初始化问题

Go
// C语言未初始化问题
int a;  // 可能是任意值

// Go零值机制
var a int  // 必定是0,安全

结构体安全初始化

Go
// 只需设置非零值字段
u := User{
    Name: "Tom",
    // Age默认0
    // Admin默认false
}

零值用途

判断是否初始化

Go
var m map[string]int

if m == nil {
    m = make(map[string]int)  // 初始化
}

检查配置

Go
type Config struct {
    Port int
}

func (c Config) GetPort() int {
    if c.Port == 0 {
        return 8080  // 默认值
    }
    return c.Port
}

要点总结

  • Go变量自动初始化为零值
  • 数值零值是0,布尔是false
  • 字符串零值是空字符串""
  • 指针、slice、map、channel零值是nil
  • 结构体所有字段自动零值
  • nil map/slice不能写入,panic
  • 零值机制避免未初始化问题
  • 用==nil判断是否已初始化

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go类型转换
下一篇 → Go循环语句for
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库