今天在聊make和new函数之前,咱们先来看一种现象 当然如果你对golang的指针还不是很了解,可以先看看这篇文章,以做到无缝连接
。看完这个,我彻底理解了golang的指针。
var a int
a = 1
fmt.Println(a)
//返回结果
//1
这个例子很简单,咱们定义了一个int类型的变量,然后赋值直接输出,这个没什么好疑问的,但是咱们把这个例子改一下
var p *int
*p = 10
fmt.Println(*p)
请问上面代码会输出什么?不出意外会输出10对不对,但是咱们运行之后,命令行却输出
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x10428df44]
goroutine 1 [running]:
main.main()
这是为什么呢?
简单说说原因:
因为我们在var p *int,只是把p变量定义为了指针类型,p的默认值为nil,「并没有在内存上分配对应的空间」,既然没有空间,那给p变量赋值自然就会报错,当然p任然是占空间的,只不过p的值为nil
如果我们把代码改成下面这样:
var p *int = new(int)
*p = 10
fmt.Println(*p)
//输出结果
//10
结果就可以正常输出,为什么加个new就可以正常输出呢?想要回答这个问题,首先你得知道new函数做了什么。
new函数主要做了下面三件事
对于int,string,float,rune,byte,bool等类型,在定义变量的时候系统已经给申请了内存,而且给了对应的默认值(int的默认值为0,string的默认值为"",bool的默认值为false),所以我们可以直接给变量进行赋值操作。
对于指针,切片,map等类型,这些变量直接定义的时候系统是没有给分配内存的,并且默认值为nil,所以不能直接赋值。如果想赋值的话,需要用new或者make函数向系统提前申请内存才行。
make和new都是用来内存分配的方法,简单的说,new只分配内存,
func make(t Type, size ...IntegerType) Type
func new(Type) *Type
make只能用来分配及初始化类型为slice,map,channel的数据;new可以分配任意类型的数据。
网站名称:聊聊Golang的Make和New函数
URL分享:http://www.shufengxianlan.com/qtweb/news14/430114.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联