Golang | new和make方法的区别
Posted Parker@1989
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang | new和make方法的区别相关的知识,希望对你有一定的参考价值。
首先我们要知道new和make都是用来创建分配类型的内容,但是使用方法不一样。
new
首先我们用一个例子来看new的使用场景
var i int
var s sring
我们通过var关键字声明两个变量,当我们不指定变量的值的时候,变量默认是类型的零值,比如int类型的零值是0,string类型的零值是"",引用类型的零值是nil。
对于以上两种类型的声明,我们可以直接使用,因为默认就已经赋零值,那么引用类型我们是不是可以使用呢?
func main()
var sp *string
*sp = "Golang"
fmt.Println(*sp)
执行以上代码会不会输出”golang”呢?
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x10a6ec3]
运行报错,因为引用类型的变量我们不能只是声明,还需要为它分配内存空间,否则程序并不知道应该把赋值存储到哪个位置,所以需要我们提前分配一个内存空间。
我们改一下程序如下:
func main()
var sp *string
sp = new(string)
*sp = "Golang"
fmt.Println(*sp)
再运行我们的程序,就可以看到输出结果了。
我们可以理解为new方法接收一个类型参数,然后分配内存,返回一个执行该类型内存地址的指针,同时把分配的内存置零,也就是为类型赋零值。
make
make也是为类型分配内存,但是和new不同,它只是为channel、slice和map类型创建内存,并返回这三个类型本身,而不是他们的指针类型,因为这三种类型本身就是引用类型。
这三种类型的结果比较复杂,比如slice要提前初始化好内部元素的类型、slice的长度和容量等,这样才可以使用。
以上是关于Golang | new和make方法的区别的主要内容,如果未能解决你的问题,请参考以下文章