Golang中的new与make有啥区别

寅恪光潜 寅恪光潜 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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这三个类型做初始化。

 

...全文

相关推荐

golang中make和new的区别示例详解

Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易,下面这篇文章主要介绍了golang中make和new的区别,需要的朋友可以参考借鉴,下面来一起看看吧。

weixin_38644599

Go语言中new()和 make()的区别详解

概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 new 的主要特性 首先 new 是内建函数,你可以从 http://golang.org/pkg/builtin/#new 这儿看到它,它的定义也很简单: 代码如下: func new(Type) *Type 官方文档对于它的描述是: 代码如下: 内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针 根据这段描述,我们可以自己实现一个类似 new 的功能: 代码如下: func newInt() *in

weixin_38721691

深入讲解Go语言中函数new与make的使用和区别

大家都知道Go语言中的函数new与函数make一直是新手比较容易混淆的东西,看着相似,但其实不同,不过解释两者之间的不同也非常容易,下面这篇文章主要给大家介绍了关于Go语言中函数new与make区别的相关资料,需要的朋友可以参考下。

weixin_38690739

golang小知识总结.docx

小知识点总结

星星不能摘

Golang面试基础总结[代码]

本文详细总结了Golang面试中常见的基础相关问题,包括Go语言的特点、面向对象特性、make和new的区别、数组与切片的区别、defer的执行顺序、闭包、反射原理等。文章通过分析面试题的考察点,提供了详细的回答和代码示例,帮助读者深入理解Golang的核心概念和机制。此外,还涵盖了CSP模式、GMP调度模式、接口设计等高级主题,为面试者提供了全面的知识储备。

g5h6i7j
评论 1
收藏 已收藏
分享
返回顶部
寅恪光潜
寅恪光潜 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
Go语言基础与进阶--寅恪光潜 200 成员 136 内容