mybatis-plus savebatch返回空指针_【技术】Vol1 Go 空指针问题

本文探讨了Go语言中的空指针问题,包括零元素值、nil比较、new()与&Struct{}的区别、类型判断、空指针检查、接口使用等方面,通过实例解析了接口与实现类之间的nil比较以及interface的内部结构。同时,文章以mybatis-plus savebatch返回空指针问题为切入点,深入理解Go语言中空指针的处理和预防。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

    零元素值

    nil 比较

    new()和&Struct{}

    .(type)

    if _, ok := v

    *pointer

    interface

    interface拓展

保持好奇心  

go  

01

零元素值

定义变量时go自动赋予变量初始值

bool

false

string

""

rune

0

iota

0

number

0

other

nil

nil只能赋值给指针、channel、func、interface、map或slice类型的变量

02

nil 比较

1.不同类型nil值的长度可能不同

2.不同类型nil值可能不能比较

3.map, slice和function,即使在同类型中nil值也不能比较

4.接口与其实现类的nil之间可比较,但为false

03

new()和&Struct{}

1.new(struct)返回指向该结构体的指针,但是所有上述other中提到的类型都会初始化为nil

2.&Struct{}同样返回指向该结构体的指针,但是可以在{}里头去初始化上述other中提到的类型字段

1d82e4ed8a3b6ec0b0c1c4515c18b412.png

https://stackoverflow.com/questions/4498998/how-to-initialize-members-in-go-struct

04

.(type)

接口判断类型,当any为nil时不会panic

6edba49f2b5a44cede157eb011f059a3.png

05

if _, ok := v

这是个非常重要的形式,避免后续空指针问题

f5fec6525c4d41599f8d191d99a6bd35.png

06

*pointer

对于任意指针,最安全的做法,就是在使用前先进行非空判断,防止后续操作直接使用空指针造成panic

cdef6ae86c9cf45ef13b70a10b31e4db.png

07

interface

先看一个比较有趣的问题:

1ffe7a6c6b08d4e8309584db75fbefa5.png

上面打印出来的结果

529b0c48be2ee7bc73d437fc54ebe0ab.png

一般来说,等号具有传递性,第四句打印为什么会为false?

go中的interface可以认为是一个二元组(T, V),如var i interface{} = 3,就会被认为是(T=int, V=3)

https://golang.org/doc/faq#nil_error

通过上述的资料可知,go在编译的时候,因为convert函数的返回值类型为error,第四句打印的nil类型被认作是 (error)nil,因此在interface的相等判断中,会被认为是不相等的。上述三句判断的类型如下:

    (*Err)err == (*Err)nil

    (*Err)errR == (error)nil

    (*Err)errR == (*Err)err

因此,如果将第四句nil修改为:

fmt.Println(errR == (*Err)(nil))

则结果就为true。

08

interface拓展

更详细介绍interface可以阅读这个文档: 

https://research.swtch.com/interfaces

interface{}符合鸭子类型,但底层仍然是静态类型interface,不保证任何方法,运行时会找到对应的方法。interface包含两个机器字,一个指向类型itable,一个指向值,如图

5e6b4ceba74c1b50d3aec5550a4bc3d4.png

itable会记录开头会记录一些类型的元数据,随后记录着指向函数方法的指针列表。指向变量的指针指向数据的拷贝。

编译器为每个具体类型生成类型描述结构体。类型描述结构包含该类型实现的方法的列表。接口运行时通过在具体类型的方法表中查找接口类型的方法表中列出的每个方法。itable生成后就会被缓存起来。

interface的静态类型会决定哪些方法可以被调用,即使变量包含了更多的方法集。

https://blog.golang.org/laws-of-reflection

举个例子:

7bf02124a6dc6717cf4f2158059aa33e.png

如注释所示,虽然r, w, empty的接口的类型都是*os.File,但底层itable表所拥有的函数子集不同导致可用函数也有所不同。

以上就是我所了解到的关于空指针的一小部分内容,也可能有理解错误的地方,欢迎各位大佬们指正与指导!

v1.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值