1. go语言中的零值
Go 语言的每种原生类型都有其默认值,这个默认值就是这个类型的零值。下面是 Go 规范定义的内置原生类型的默认值(零值)。
所有整型类型:0 ;浮点类型:0.0 ;布尔类型:false ;字符串类型:"" ;指针、interface、slice、channel、map、function:nil
2.零值可用
当我们申明了一个变量,但是未对其进行显示初始化时,go语言编译器就会把该变量置为默认零值,且可以直接使用该变量。 例如:
var a []int
fmt.Println(a)
a = append(a, 6)
fmt.Println(a)
但是不能直接对切片进行赋值操作这样会出现错误,同样的还有map。
3、零值可用的好处
- 开箱即用:go语言零值让程序变得简单了,有些场景我们不需要初始化变量就可以直接进行使用。 例如上面的slice、map还有基础类型。
- 方法的归纳 利用零值可用的特性,我们可以通过定义一个空的结构体,配合空结构体方法接收者属性,将一些方法组合起来,在业务代码中便于后续的拓展和维护。
type T struct {
}
func (t *T) work() {
fmt.Println("开始工作")
}
func (t *T) endWork() {
fmt.Println("下班")
}
func main() {
var t T
t.work()
t.endWork()
}
- 标准库中可以不显示初始化 在GO标准库和运行时代码中,典型的零值可用:sync.Mutex 和 bytes.Buffer
type Mutex struct {
state int32
sema uint32
}
发现sync.Mutex结构体中的字段都是零值可用的,所以我们在使用该结构体时不需要显示的初等化就可以直接调用结构中的方法。
自定义一个结构体,里面字段都是未显示初始化时为零值,且操作不会造成报错时,就可以不用显示初始化直接调用。
type T struct {
day int
temperature int
}
func main() {
var t T
t.work()
t.nowTemperature()
}
func (t *T) work() {
fmt.Printf("together work %d days\n", t.day)
}
func (t *T) nowTemperature() {
fmt.Printf("today temperature %d\n", t.temperature)
}