会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 Golang 语言怎么避免空指针引发的 Panic!

Golang 语言怎么避免空指针引发的 Panic

时间:2025-11-04 13:27:15 来源:益强数据堂 作者:域名 阅读:399次

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 的场景。

(责任编辑:应用开发)

推荐内容
  • 安装Win7虚拟机系统的完整教程(详细指导您如何在计算机上安装Win7虚拟机系统)
  • 十分钟入门Fink SQL
  • 看到Mybatis源码就感到烦躁,怎么办?
  • 在您现有的向量数据库中使用LLM中您自己的数据
  • 轻松学会3分钟让电脑自动修复系统(无需专业技能,快速解决常见电脑问题)
  • 2024年最复杂的网络安全威胁