返回顶部
首页 > 资讯 > 后端开发 > GO >Golang语言如何避免空指针引发的panic详解
  • 541
分享到

Golang语言如何避免空指针引发的panic详解

2024-04-02 19:04:59 541人浏览 安东尼
摘要

目录01、介绍02、结构体指针类型返回值03、结构体指针类型 value 的 Map04、defer 延迟调用05、总结01、介绍 在 golang 语言项目开发中,变量操作不当就会

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
}

04、defer 延迟调用

关键字 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 的场景,虽然都比较简单,但是新手很容易踩“坑”。

到此这篇关于Golang语言如何避免空指针引发panic的文章就介绍到这了,更多相关Go语言避免空指针引发panic内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

参考资料:

  • https://yourbasic.org/golang/gotcha-nil-pointer-dereference/
  • https://blog.wuhsun.com/panic-runtime-error-invalid-memory-address-or-nil-pointer-dereference/
  • https://programmerah.com/go-solve-panic-runtime-error-invalid-memory-address-or-nil-pointer-dereference-in-golang-28179/
  • https://stackoverflow.com/questions/16280176/go-panic-runtime-error-invalid-memory-address-or-nil-pointer-dereference
您可能感兴趣的文档:

--结束END--

本文标题: Golang语言如何避免空指针引发的panic详解

本文链接: https://lsjlt.com/news/161725.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang语言如何避免空指针引发的panic详解
    目录01、介绍02、结构体指针类型返回值03、结构体指针类型 value 的 Map04、defer 延迟调用05、总结01、介绍 在 Golang 语言项目开发中,变量操作不当就会...
    99+
    2024-04-02
  • Golang语言该怎么避免空指针引发的panic
    这篇文章将为大家详细讲解有关Golang语言该怎么避免空指针引发的panic,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。01、介绍在 Golang 语言项目开发中,变量操作不当就会触发空指...
    99+
    2023-06-26
  • Java中空指针异常该如何避免详解
    Java中如何避免空指针异常,这也是由初级程序员成长到中级程序员的时候经常会遇到的问题。 程序员不知道或不信任正在使用的约定,并且小心的检查着null。还有当程序员写代码的时候,总是...
    99+
    2024-04-02
  • C语言的空类型指针,空指针,野指针详解
    目录空类型指针-void*空指针-NULL野指针造成野指针的原因1.指针未初始化2.指针越界访问3.指针指向的空间已经释放避免野指针总结空类型指针-void* void是空类型,vo...
    99+
    2024-04-02
  • 详解C语言的void*空指针
    目录void的应用空指针类型(void*)总结在C语言中,void称为无类型,相应的void*称为无类型指针或者空指针类型。 void的应用 对函数返回值的限定。 例如void fu...
    99+
    2024-04-02
  • 如何使用PHP8中的Nullsafe Operator避免空指针异常?
    如何使用PHP8中的Nullsafe Operator避免空指针异常?随着PHP8的发布,PHP语言中引入了一个重要的新特性——Nullsafe操作符,该操作符可以帮助开发者更简洁高效地处理可能引发空指针异常的代码。本文将详细介绍如何使用N...
    99+
    2023-10-22
    PHP 空指针异常 Nullsafe Operator
  • 如何理解C语言函数传参:指针的指针
    这篇文章主要介绍“如何理解C语言函数传参:指针的指针”,在日常操作中,相信很多人在如何理解C语言函数传参:指针的指针问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解C语言函数传参:指针的指针”的疑惑有所...
    99+
    2023-06-15
  • 如何理解C语言中的指针
    这期内容当中小编将会给大家带来有关如何理解C语言中的指针,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1指针是什么指针是汇编语言中的一个对象,利用地址,指向存在电脑存储器中的另一个地方的值。由于通过地址能...
    99+
    2023-06-25
  • c语言的指针数组如何理解
    本篇文章给大家分享的是有关c语言的指针数组如何理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。指针如何指向数组,并读取数组中的元素:#include <std...
    99+
    2023-06-22
  • 如何理解C语言中的指针类型
    如何理解C语言中的指针类型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。0.问题知乎上回答了一个粉丝问题,结果这兄弟又连续问了...
    99+
    2024-04-02
  • Go 语言中,如何避免同步缓存的并发问题?
    在 Go 语言中,同步缓存的并发问题是一个经典的问题。在多个协程同时读写同一个缓存时,很容易出现数据不一致的问题。本文将介绍如何在 Go 语言中避免同步缓存的并发问题,并提供一些演示代码。 一、什么是同步缓存? 在 Go 语言中,同步缓存是...
    99+
    2023-06-28
    关键字 同步 缓存
  • C语言指针与引用的区别以及引用的三种用法案例详解
    1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名。 下面引自://www.jb51.net/article/221791.htm 从概念上讲。指针从本质上讲就是...
    99+
    2024-04-02
  • Go语言并发编程:如何避免load教程的性能瓶颈?
    Go语言的并发编程是其最大的特色之一,但是在实现并发编程时,很容易遇到load教程的性能瓶颈。本文将介绍如何避免这个问题。 一、load教程的性能瓶颈 load教程是Go语言并发编程中常见的一种模式,它可以让多个goroutine共享同一个...
    99+
    2023-06-08
    load 教程 并发
  • Go语言并发编程中的存储问题:如何避免数据竞争?
    Go语言是一门强大的编程语言,它的并发编程能力为开发人员提供了更高效的解决方案。然而,随着并发编程的复杂性增加,存储问题也变得越来越复杂。在这篇文章中,我们将探讨Go语言并发编程中的存储问题,以及如何避免数据竞争。 一、Go语言的并发编程 ...
    99+
    2023-10-17
    并发 教程 存储
  • go语言中的缓存和并发处理:如何避免容器的竞争和死锁问题?
    Go语言是一门非常强大的编程语言,它特别擅长处理并发。在Go语言中,我们可以使用缓存来提高程序的运行效率,同时也可以通过并发处理来避免容器的竞争和死锁问题。本文将为你详细介绍Go语言中的缓存和并发处理,并提供一些演示代码。 一、什么是缓存?...
    99+
    2023-11-07
    缓存 并发 容器
  • Go语言在Spring中的索引并发:如何解决常见问题?
    在现代计算机系统中,数据库是一个必不可少的组件。对于大型应用程序,使用关系型数据库来存储和管理数据是非常常见的。Spring框架是一个非常流行的Java企业应用程序框架,它提供了各种各样的功能和服务,包括数据存储和管理。 在Spring中...
    99+
    2023-10-06
    索引 并发 spring
  • 如何在Linux系统上使用Go语言解决LeetCode的数组问题?详细指南
    在LeetCode上,数组问题是非常常见的一类问题。而在Linux系统上使用Go语言来解决这些问题,可以提高我们的编程效率和代码质量。下面是一份详细的指南,帮助你更好地应对数组问题。 安装Go语言环境 在Linux系统上使用Go语言,首...
    99+
    2023-09-23
    leetcode 数组 linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作