1

go语言之nil

 1 year ago
source link: https://blog.51cto.com/u_3764469/5706856
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

go语言之nil

精选 原创

zzxiaoma 2022-09-23 14:27:28 博主文章分类:go ©著作权

文章标签 赋值 初始化 字面量 文章分类 Go语言 编程语言 yyds干货盘点 阅读数178

在go语言中,nil是一个零值,如果我们在声明整数的时候没有为变量赋值,那么该整数的值默认是0,如果是一个指针没有明确的指向,它的值就是nil,除了指针,nil还标识切片、映射和接口的零值。

如果对一个指针进行解引用程序会崩溃

var abc *int
fmt.Println(*abc)

为了避免程序崩溃,需要通过对nil判断进行避免

if(abc != nil){
fmt.Println(*abc)
}

当变量被声明为函数类型时,它的默认值为nil。

var fn func(a,b int) int
fmt.Println(fn == nil)

这时候如果需要用到fn就需要进行判断是否nil。

切片如果声明之后没有通过内置的make或者复合字面量进行的初始化,它的值将是nil,切片的许多方法可以处理nil的切片,所以直接调用切片方法可以不用对nil进行处理

var abc[]string
fmt.Println(len(abc)) //0
abc = append(abc,"aaa")

项len和append都可以正常使用

跟切片一样,如果映射在声明之后没有使用内置的make或者复合字面量进行的初始化,它的值将是nil,映射的许多方法可以处理nil,但是写入方法会异常。

var abc map[string]int
ment, ok:= abc["adb"]
if ok {
fmt.Println(ment2)
}

声明为接口类型的变量在未被赋值时的零值为nil。

var v interface{}
fmt.Printf("%T %v %v\n",v,v,v==nil)

如果接口类型的变量被赋值之后,接口就会在内部指向该变量的类型和值。

var p *int
v = p
fmt.Printf("%T %v %v\n",v,v,v==nil)

你会发现值为nil的变量不等于nil,这是因为接口类型的变量只有类型和值都是nil时才等于nil,所以即使接口变量的值仍然是nil,但只要他的类型不为nil,那么该变量就不等于nil。

为了避免在比较接口变量和nil时得出出乎意料的结果,最好的做法是明确地使用nil标识符,而不是指向一个包含nil的变量。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK