文章目录
基本
golang 中的关键词 nil 表示空,与其他语言中的 null 可能使用有较大区别。nil 甚至可以说不是 golang 中的关键词,而只是一个变量名,如下 builting.go 的代码
var nil Type
golang 中针对不同的类型,nil 有不同的判空方式
指针
结论:当一个指针(所有值类型的指针,包括了 struct),没有指向任何值,那么它就可以等于 nil
下方代码给指针类型赋 nil
var a *int = nil
slice
结论:当指针指向是 nil,且 len 和 cap 都是 0,该 slice 才等于 nil
var arr1 []int // true fmt.Println(arr1 == nil) arr2 := []int{
} // false fmt.Println(arr2 == nil)
我们可以看到 arr1 是 nil,因为它指向为空,len 和 cap 都是 0,arr2 不是 nil,即使 len 和 cap 都是 0,但是 arr2 指向不是空,arr2 依然是 nil
interface
结论:当 type 和 value 都是 nil 的时候,此 interface 才等于 nil
type A interface{
} type B struct{
} var a1 A // true fmt.Println(a1 == nil) var a2 A = (*B)(nil) // false fmt.Println(a2 == nil) var b1 *B // false fmt.Println(A(b1) == nil) var b2 *B // true fmt.Println(A(b2) == (*B)(nil))
我们可以看到 a1 是 nil,因为这个接口 type 和值都是空;a2 不是 nil,因为 a2 获得了一个赋值存在类型 B 所以 a2 不是 nil;b1 转成 A 后不是 nil,因为转化后的接口存在类型 B,所以 b1 转成 A 后不是 nil;b2 转成 A 后,是存在带有 B 类型的 nil,所以最后一个现实也是 true
channel/map/func
简单说都是一个指针指向一堆实现,我们简单看成指针就行了,如果这些指针没有指向就是 nil 了
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225180.html原文链接:https://javaforall.net
