获得徽章 0
- 学习Golang中的零值、空值与空结构
零值
Golang零值是指声明变量时并未显示初始化,始终为你的变量自动设置应该默认的初始化值,就叫做零值。
此类变量或值的每个元素都设置为其类型的零值:布尔值为false,数字类型为0,字符串为“”,指针、函数、接口、切片、通道、和映射为nil。
空值nil
Golang的nil与在C中的NULL和C++中的nullptr类似,但是nil时Golang中预先声明的标识符,其主要用来表示引用类型的零值(指针、接口、函数、映射、切片和通道),表示它们未初始化的值
nil是Golang中唯一没有默认类型的非类型化的值,它不是一个未定义的状态。
空结构
定义:空结构是没有任何字段的结构类型。
我们知道C语言·和C++中一个结构体的大小是由其字段宽度(size)和内存对齐共同决定的,这样有助于寻址速度。
很显然,空结果的占用占用空间大小为零字节。
由于空结构占用零字节,因此不需要填充对齐,所以由嵌套空结构的空结构也不会占用存储空间。
由于空结构不占用内存空间,所以我们声明以空结构作为元素的数组或切片,也是不占用空间的。
对于空结构(或者空数组),其占用的存储大小的变量在内存中可能具有相同的地址。 #青训营 x 字节后端训练营#展开评论4 - #青训营 x 字节后端训练营#
nil 可以用来检查错误,通过返回值(return nil;)
nil 与c/c++中null的区别还是挺大的,具体如下:
> nil 是 Golang 中预先声明的标识符(非关键字保留字),其主要用来表示引用类型的零值(指针,接口,函数,映射,切片和通道),表示它们未初始化的值。
nil 是 Golang 中唯一没有默认类型的非类型化的值,它是一个未定义的状态。例子:a:=nil;将一个并没有类型 nil 的值赋给 a 是不对的,编译器不知道它该给 a 分配什么类型。
**nil != nil 的问题**
var p *int
var i interface{}
fmt.Println(p) // <nil>
fmt.Println(i) // <nil>
fmt.Println(p == i) // false
为什么同样都是nil却不相等?再来看看下面这个例子还有注释:
fmt.Println(p==nil)//true(T=*int,V=nil)
fmt.Println(i==nil)//false(T=nil,V=nil)
var p *int //此时T=*int,V=nil
var i interface{} //此时T=nil,V=nil
//所以导致p!=i因为即使p的V与i的V相等了但是由于V的类型不定所以导致二者不相等
接口要确定一个变量需要两个基础属性:Type and Value
var p *int类型的nil--p因为编译器已经清楚的知道了 p 的类型,所以编译器可以转化为 p == (*int)(nil)。但是对于接口,编译器是没法确定底层类型的,因为它是可以被更改的。展开评论2