01简介在Golang语言项目开发中,变量操作不当会触发空指针导致程序panic。空指针是没有分配内存的指针类型的变量。变量的值为nil,因为操作空指针会引起panic,所以我们在程序开发中一定要小心。02结构指针类型的返回值当调用结构指针类型返回值的函数或方法时,需要对返回值的字段或方法进行操作,此时需要注意触发空指针引起的panic。运行返回值字段:funcmain(){user:=GetUser()fmt.Println(user)fmt.Println(user.Id)}funcGetUser()(user*User){return}typeUserstruct{IdintNamestring}看了上面这段代码,我们通过调用函数GetUser()得到了*User类型的返回值,因为返回值变量是一个空指针,当我们访问返回值的字段时,程序就panic了。要避免这种空指针问题,首先,在返回值包含指针类型变量的函数或方法中,可以在函数体的开头初始化返回值的指针类型变量;二、调用结构体指针类型返回值的函数或方法时,在操作有返回值的字段或方法时,先判断返回值是否为nil(空指针)。funcmain(){user:=GetUser()fmt.Println(user)ifuser!=nil{fmt.Println(user.Id)}}funcGetUser()(user*User){user=new(User)//user=&User{}return}typeUserstruct{IdintNamestring}操作返回值方法:funcmain(){user:=GetUser()user.Login()}funcGetUser()(user*User){return}typeUserstruct{IdintNamestring}func(uUser)Login(){}看了上面的代码,我们通过调用函数GetUser()得到了*User类型的返回值,因为返回值变量是一个空指针,当我们访问返回值的方法Login()时,程序触发空指针引起恐慌。要避免这种空指针问题,首先,在返回值为指针类型变量的函数或方法的函数体中,可以在一开始就初始化返回值的指针类型变量;其次,类型方法的接收者使用指针类型。funcmain(){user:=GetUser()user.Login()}funcGetUser()(user*User){user=new(User)//user=&User{}return}typeUserstruct{IdintNamestring}func(u*User)Login(){}03结构体指针类型值的Map在Golang语言程序开发中,经常会操作结构体指针类型值的Map,同样需要注意触发空指针导致panic。funcmain(){varuserDatamap[int]*Userfmt.Println(userData[1].Name)}typeUserstruct{IdintNamestring}看了上面的代码,我们定义了map类型的变量userData,key是int类型,value是结构体指针类型,当我们访问map的值时,因为该值是一个空指针,所以会抛出一个panic。为了避免此类空指针问题,我们可以使用ok-idiom模式来判断key值是否存在。如果键值存在(判断键值是否为nil),则访问键值的字段,否则不访问。这样也可以避免触发空指针导致panic。funcmain(){varuserDatamap[int]*Userifval,ok:=userData[1];ok{fmt.Println(val.Name)}}typeUserstruct{IdintNamestring}04deferdefer关键字defer延迟调用函数,虽然被调用的函数会调用被延迟了,但是被调用函数的变量会先被注册。所以,如果被调用函数的变量是空指针,就会panic。funcmain(){res,err:=http.Get("http://www.baidu2022.com/robots.txt")//伪造错误请求deferres.Body.Close()iferr!=nil{log.Fatal(err)}body,err:=io.ReadAll(res.Body)iferr!=nil{log.Fatal(err)}fmt.Printf("%s",body)}阅读上面的代码,使用defer延迟call函数释放资源,因为我们把defer放在了错误检查之后,所以如果返回值res是空指针,就会panic。为了避免这种空指针问题,我们可以在使用defer调用前做错误检查,遇到错误就停止向下执行。05总结在这篇文章中,我们介绍了一些Golang语言开发需要避免空指针引起的panic的场景。虽然比较简单,但是新手很容易踩“坑”。欢迎读者朋友在评论区与大家分享更多触发空指针导致的panic场景。
