Golang 零值、空值与空结构

53 阅读1分钟

零值

  • 对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。

  • 对于引用类型: 均为 nil,包括指针 pointer,函数 function,接口 interface,切片 slice,管道 channel,映射 map。

nil

空值(nil) :在Go语言中,nil是一个预定义的标识符,用于表示指针、通道(channel)、映射(map)、切片(slice)、函数以及接口类型的“零值”。它相当于这些类型的“无”或“不存在”。例如,一个nil指针不指向任何内存地址,而一个nil通道不连接任何发送者或接收者。

  • 初始化未使用的指针或引用类型变量。
  • 检查一个变量是否已被初始化或有效。
  • 在错误处理中,表示一个操作没有返回错误。

空结构

作用二

使用 chan struct{} 代替 chan bool 在 goroutines 之间传递信号。使用 bool 容易让人不理解该值,true or false,但是使用 chan struct{} 就很清楚,我们不在乎值,只关心发生的事儿,更容易表达清楚一些。

作用一

用来强制使用字段名来初始化结构体,防止未命名的初始化方式。

正常的结构体

type Q struct {
    X, Y int
}

// 两种初始化方式都可以
q1 := Q{X: 1, Y: 1}  // 推荐:使用字段名
q2 := Q{1, 1}        // 不推荐:按位置初始化

添加 _ struct{} 后的结构体

type Q struct {
    X, Y int
    _    struct{}  // 添加这个字段
}

// 现在只能这样初始化
q1 := Q{X: 1, Y: 1}  // ✅ 编译通过

// 这样会报错
q2 := Q{1, 1}        // ❌ 编译错误:too few values in struct initializer