Golang中的new与make有啥区别

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

new和make看起来都一样,很多时候的操作也都是没啥区别,我们来看下:

i1 := new(int)
*i1 = *i1 + 3
fmt.Printf("%#v,%#v\n", i1, *i1) //(*int)(0xc0000a6058),3

m1 := make(map[string]string)
m1["name"] = "寅恪光潜"
fmt.Printf("%p,%#v\n", m1, m1) //0xc0000b6480,map[string]string{"name":"寅恪光潜"}

都是可以初始化然后进行操作是吧,那为什么多此一举多一个方法呢?其实还是有很大区别的,我们来看下这个整型指针的初始化操作:

i := new(*int)
fmt.Printf("%#v,%#v\n", i, *i)
//(**int)(0xc0000c4020),(*int)(nil)

可以看到初始化为nil指针与值,这个时候做自增等操作,那肯定是报错的。

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

但是通过make初始化的nil可以将他们初始化成空,地址是有效地址,我们来看下:

m := make(map[string]string)
fmt.Printf("%p,%#v\n", m, m)//0xc000072510,map[string]string{}

m["name"] = "寅恪光潜"
fmt.Printf("%p,%#v\n", m, m)//0xc000072510,map[string]string{"name":"寅恪光潜"}

 可以看到没有出现nil指针以及nil值对吧。注意:make只针对map,slice,channel这三个类型做初始化。

 

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

198

社区成员

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

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

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

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