本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
Golang 语言怎么避免空指针引发的 Panic
yuanzun168 · 225浏览 · 发布于2022-01-05 +关注

本文我们介绍一些 Golang 语言开发需要避免空指针引发 panic 的场景,虽然都比较简单,但是新手很容易踩“坑”。欢迎读者朋友们在评论区与大家分享更多因为触发空指针引发 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 的场景。


                相关推荐

                PHP实现部分字符隐藏

                沙雕mars · 1324浏览 · 2019-04-28 09:47:56
                Java中ArrayList和LinkedList区别

                kenrry1992 · 907浏览 · 2019-05-08 21:14:54
                Tomcat 下载及安装配置

                manongba · 968浏览 · 2019-05-13 21:03:56
                JAVA变量介绍

                manongba · 961浏览 · 2019-05-13 21:05:52
                什么是SpringBoot

                iamitnan · 1086浏览 · 2019-05-14 22:20:36
                加载中

                0评论

                评论
                欢迎大家关注我的个人主页!!!
                分类专栏
                小鸟云服务器
                扫码进入手机网页