这篇文章将为大家详细讲解有关Golang语言该怎么避免空指针引发的panic,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
在 Golang 语言项目开发中,变量操作不当就会触发空指针引发程序 panic。空指针就是未分配内存的指针类型的变量,变量的值是 nil,因为操作空指针会引发 panic,所以我们在程序开发中要特别小心。
在调用结构体指针类型返回值的函数或方法时,并且需要操作返回值的字段或方法,此时,我们就需要注意触发空指针引发的 panic。
操作返回值的字段:
func main() { user := GetUser() fmt.Println(user) fmt.Println(user.Id) } func GetUser() (user *User) { return } type User struct { Id int Name string }
阅读上面这段代码,我们通过调用函数 GetUser() 获取 *User 类型的返回值,因为返回值变量是空指针,当我们访问返回值的字段时,程序引发 panic。
避免此类空指针问题,一是可以在返回值包含指针类型变量的函数或方法中,在函数体开头初始化返回值的指针类型变量;二是在调用结构体指针类型返回值的函数或方法时,在操作返回值的字段或方法时,先判定返回值是否为 nil(空指针)。
func main() { user := GetUser() fmt.Println(user) if user != nil { fmt.Println(user.Id) } } func GetUser() (user *User) { user = new(User) // user = &User{} return } type User struct { Id int Name string }
操作返回值的方法:
func main() { user := GetUser() user.Login() } func GetUser() (user *User) { return } type User struct { Id int Name string } func (u User) Login() { }
阅读上面这段代码,我们通过调用函数 GetUser() 获取 *User 类型的返回值,因为返回值变量是空指针,当我们访问返回值的方法 Login() 时,程序触发空指针引发 panic。
避免此类空指针问题,一是可以在返回值是指针类型变量的函数或方法的函数体中,开头先初始化返回值的指针类型变量;二是类型方法的接收者使用指针类型。
func main() { user := GetUser() user.Login() } func GetUser() (user *User) { user = new(User) // user = &User{} return } type User struct { Id int Name string } func (u *User) Login() { }
在 Golang 语言程序开发中,经常会操作结构体指针类型 value 的 Map,也需要注意触发空指针引发 panic。
func main() { var userData map[int]*User fmt.Println(userData[1].Name) } type User struct { Id int Name string }
阅读上面这段代码,我们定义 map 类型的变量 userData,key 是 int 类型,value 是结构体指针类型,我们访问 map 的值时,因为值是空指针,所以会引发 panic。
避免此类空指针问题,我们可以使用 ok-idiom 模式判断键值是否存在,如果键值存在(判断键值是否为 nil),我们访问键值的字段,否则不访问。通过这种方式,也可以避免触发空指针引发 panic。
func main() { var userData map[int]*User if val, ok := userData[1]; ok { fmt.Println(val.Name) } } type User struct { Id int Name string }
关键字 defer 延迟调用函数,虽然被调用函数会延迟调用,但是被调用函数的变量会先被注册。所以,如果被调用函数的变量是空指针,就会引发 panic。
func main() { res, err := http.Get("http://www.baidu2022.com/robots.txt") // 伪造错误请求 defer res.Body.Close() if err != nil { log.Fatal(err) } body, err := io.ReadAll(res.Body) if err != nil { log.Fatal(err) } fmt.Printf("%s", body) }
阅读上面这段代码,使用 defer 延迟调用函数释放资源,因为我们将 defer 放在错误检查之后,所以如果返回值 res 是空指针,就会引发 panic。
避免此类空指针问题,我们可以在使用 defer 调用之前,先做错误检查,并且遇到错误后停止向下执行。
关于Golang语言该怎么避免空指针引发的panic就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。