明天在聊make和new函数之前,咱们先来看一种景象
当然如果你对golang的指针还不是很理解,能够先看看这篇文章,以做到无缝连贯
看完这个,我彻底了解了golang的指针
case1
var a inta = 1fmt.Println(a)//返回后果//1
这个例子很简略,咱们定义了一个int类型的变量,而后赋值间接输入,这个没什么好疑难的,然而咱们把这个例子改一下
case2
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类型的内存空间
- 操作系统将调配的空间返回给go程序
在内存中开拓了一块int的空间,并且把该空间的指针指向p
因为当初指针p曾经指向了一块被调配的空间,所以能够间接进行赋值操作小结
- 对于int,string,float,rune,byte,bool等类型,在定义变量的时候零碎曾经给申请了内存,而且给了对应的默认值(int的默认值为0,string的默认值为"",bool的默认值为false),所以咱们能够间接给变量进行赋值操作
对于指针,切片,map等类型,这些变量间接定义的时候零碎是没有给分配内存的,并且默认值为nil,所以不能间接赋值。如果想赋值的话,须要用new或者make函数向零碎提前申请内存才行。
make和new的区别
make和new都是用来内存调配的办法,简略的说,new只分配内存,
- make用于slice,map,和channel的初始化,不仅能够开拓一个内存,还能给这个内存的类型初始化其零值
make返回的还是援用类型自身;而new返回的是指向类型的指针。
make
func make(t Type, size ...IntegerType) Type
new
func new(Type) *Type
make只能用来调配及初始化类型为slice,map,channel的数据;new能够调配任意类型的数据。
创作不易,如果这篇文章帮到了您,记得点个赞点个关注哦。你们的关注是我继续上来的能源
本文由mdnice多平台公布