Golang中的nil的一些相关知识

寅恪光潜
领域专家: 人工智能技术领域
2022-12-10 10:47:55

nil是go语言中的预先定义的标识符,不是关键字或保留字!

默认值

很多的默认值是nil,当然一些基类型的默认值不是nil,这个需要注意:

布尔类型的零值(初始值)为 false
数值类型的零值为 0
字符串类型的零值为空字符串""
除此之外其它类型的默认值为nil,代表下面这些类型的零值:
指针类型(包括unsafe中的)
map类型
slice类型
function类型
channel类型
interface类型

比如整型和整型指针 :

var n1 *int
​​​​​​​fmt.Printf("%p,%#v\n", n1, n1)
//0x0,(*int)(nil)

var n2 int
fmt.Printf("%p,%#v\n", &n2, n2)
//0xc000122078,0

 我们可以看到,第一个整型指针的初始指针是nil指针或说无效指针,第二个就是常见的整型,取地址可以看到是正常的,默认初始化为0

如果我们做一个自增的操作,看下会发生什么事情?

var n1 *int
*n1++
fmt.Printf("%p,%#v\n", n1, n1)
/*
	发生异常: panic
	"runtime error: invalid memory address or nil pointer dereference"
*/


var n2 int
n2++
fmt.Printf("%p,%#v\n", &n2, n2)
//0xc00001a098,1

就会报错了,因为是nil指针,nil的值,所以没法做加法操作,而整型当然是没有问题的,可以累加。

不同类型的指针一样 

虽然存在各种不同的指针类型,但是初始化的指针都是一样的,如下:

var str *string
fmt.Printf("%p,%#v\n", str, str) //0x0,(*string)(nil)

var str1 *[]string
fmt.Printf("%p,%#v", str1, str1) //0x0,(*[]string)(nil)

可以看到他们的指针都是0x0,值都是nil

...全文
75 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-编程语言 发布问题, 以便更快地解决您的疑问

198

社区成员

发帖
与我相关
我的任务
社区描述
从零开始的小白到进阶成技术达人。 一起学习,一起进步。
golanggo1.19 个人社区 贵州省·贵阳市
社区管理员
  • 寅恪光潜
  • 网络豆
  • Somnus_小凯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

Go语言集各语言优势之大成,从基础到进阶

一起学习,一起进步,成为技术达人!

试试用AI创作助手写篇文章吧