聊聊Golang的Make和New函数

开发 前端
对于int,string,float,rune,byte,bool等类型,在定义变量的时候系统已经给申请了内存,而且给了对应的默认值(int的默认值为0,string的默认值为"",bool的默认值为false),所以我们可以直接给变量进行赋值操作。

今天在聊make和new函数之前,咱们先来看一种现象 当然如果你对golang的指针还不是很了解,可以先看看这篇文章,以做到无缝连接

。看完这个,我彻底理解了golang的指针。

case1​

var a int
a = 1
fmt.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可以分配任意类型的数据。

责任编辑:武晓燕 来源: 程序员小饭
相关推荐

2020-09-15 12:57:56

Golangnewmake

2023-10-23 19:27:21

Go函数

2023-10-27 11:27:14

Go函数

2023-03-24 08:01:27

Go语言内存

2023-03-10 15:45:03

Golang公平锁

2021-03-05 08:51:00

Go语言make

2023-11-06 09:21:39

表达式类型Cause

2023-01-26 00:59:39

B-Treegolang度量衡

2021-06-09 07:32:18

C++内置函数函数传参

2023-11-29 07:47:29

Golang函数

2024-02-20 21:34:16

循环GolangGo

2023-11-01 16:55:27

Golang匿名函数

2021-05-28 08:52:45

Hive分析函数

2021-09-08 08:55:45

Javascript 高阶函数前端

2022-03-30 09:01:37

CSS属性函数

2021-06-01 23:18:00

Golang语言Method

2022-10-17 08:22:28

2023-09-13 08:00:57

云原生Java开发者

2022-07-26 00:36:06

C#C++函数

2023-11-05 12:20:10

匿名函数Golang
点赞
收藏

51CTO技术栈公众号