Golang 语言怎么避免空指针引发的 Panic
01介绍
在 Golang 语言项目开发中,避免变量操作不当就会触发空指针引发程序 panic。针引空指针就是避免未分配内存的指针类型的变量,变量的针引值是 nil,因为操作空指针会引发 panic,避免所以我们在程序开发中要特别小心。针引
02结构体指针类型返回值
在调用结构体指针类型返回值的避免函数或方法时,并且需要操作返回值的针引字段或方法,此时,避免我们就需要注意触发空指针引发的针引 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() { }03结构体指针类型 value 的 Map
在 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 }04defer 延迟调用
关键字 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 调用之前,先做错误检查,并且遇到错误后停止向下执行。
05总结
本文我们介绍一些 Golang 语言开发需要避免空指针引发 panic 的场景,虽然都比较简单,但是新手很容易踩“坑”。欢迎读者朋友们在评论区与大家分享更多因为触发空指针引发 panic 的场景。
相关文章
教你如何设置戴尔电脑的启动项(详解戴尔电脑启动设置及常见问题解答)
摘要:戴尔电脑是广受欢迎的电脑品牌之一,但是对于一些用户来说,启动项的设置可能会有些困惑。本文将详细介绍如何设置戴尔电脑的启动项,并解答常见问题,帮助您更好地使用电脑。一、什么是...2025-11-04iuniN1手机——一款值得期待的性价比之选(iuniN1手机的性能、外观和用户体验综合评测)
摘要:iuniN1是一款备受关注的智能手机,它在性能、外观和用户体验方面都有着令人期待的表现。本文将从多个角度对iuniN1进行全面评测,以便读者能够更好地了解这款手机的优势和特点。...2025-11-04华硕M5A78L一MLX3主板性能与特点剖析(一款高性价比主板的全面评测与分析)
摘要:华硕M5A78L一MLX3是一款经典的AMD平台主板,它以高性价比、稳定可靠等优势受到了许多用户的青睐。本文将对该主板的性能与特点进行详细剖析,让读者了解该主板是否适合自己的需求。...2025-11-04如何使用路由器重新设置WiFi密码(简单教程帮您轻松修改家庭网络密码)
摘要:随着无线网络的普及,我们经常需要为家庭网络重新设置WiFi密码。本文将为您提供一份简单的教程,教您如何使用路由器重新设置WiFi密码,以确保网络安全。1.了解路由器安全...2025-11-04电脑凤凰系统使用技巧教程(掌握电脑凤凰系统的关键技巧,提升工作效率)
摘要:随着科技的发展,电脑凤凰系统已成为许多人生活中必不可少的工具。然而,很多人仅仅只会基本的操作,对于系统中更多实用的功能并不熟悉。本文将为大家分享一些关于电脑凤凰系统使用的技巧,帮助...2025-11-04使用U盘将XP系统升级为Windows7的详细教程(从XP到Windows7升级步骤一览,完美实现系统升级)
摘要:Windows7操作系统相较于XP拥有更多的功能和性能优化,因此很多用户想要将自己的XP系统升级为Windows7。本教程将详细介绍如何利用U盘将XP系统升级为Windows7的步...2025-11-04


最新评论