关于后端:聊聊golang的make和new函数

2次阅读

共计 1284 个字符,预计需要花费 4 分钟才能阅读完成。

明天在聊 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 能够调配任意类型的数据。

    创作不易,如果这篇文章帮到了您,记得点个赞点个关注哦。你们的关注是我继续上来的能源

本文由 mdnice 多平台公布

正文完
 0