-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46569
- shell命令
-
- 文章:(42)篇
- 阅读:154249
- Git教程
-
- 文章:(36)篇
- 阅读:234886
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131876
-
go语言中new和make函数使用详解2018-04-22 15:35 阅读(7845) 评论(0)
go语言中,new函数和make函数,都是为变量要分配内存空间,在“Go语言中变量和常量”中提到过,针对引用类型的变量,使用前必须分配空间,如下变量sum,如果直接使用就会报错:
var sum *int *sum = 98 // 使用前没有分配空间,即初始化,会报错 fmt.Println(*sum)
new函数和make函数二者有有什么区别呢?
一、new函数
在go语言中,new函数描述如下:
// The new built-in function allocates memory. The first argument is a type, // not a value, and the value returned is a pointer to a newly // allocated zero value of that type. func new(Type) *Type
从上面可以看出,
new函数参数为数据类型,返回值为指向该数据类型对应的指针。指针指向的地址默认对应的值为该数据类型的零值。
现在,我们通过new函数为上面的案例分配一下空间,如下:
var sum *int sum = new(int) //分配空间 *sum = 98 fmt.Println(*sum)
当然,new函数,不仅仅能够为系统默认的数据类型,分配空间,自定义类型,也可以使用new函数来分配空间,如下:
type Student struct { name string age int } var s *Student s = new(Student) //分配空间 s.name ="dequan" fmt.Println(s)
当然,如果不进行分配空间,就会报错:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x80bd277]
goroutine 1 [running]:
备注:new函数,没法对chan(通道)、map(字典)、slice(切片)来分配内存,于是有了make函数。
二、make函数
在go语言中,make函数的描述如下:
// The make built-in function allocates and initializes an object of type // slice, map, or chan (only). Like new, the first argument is a type, not a // value. Unlike new, make's return type is the same as the type of its // argument, not a pointer to it. The specification of the result depends on // the type: // Slice: The size specifies the length. The capacity of the slice is // equal to its length. A second integer argument may be provided to // specify a different capacity; it must be no smaller than the // length, so make([]int, 0, 10) allocates a slice of length 0 and // capacity 10. // Map: An empty map is allocated with enough space to hold the // specified number of elements. The size may be omitted, in which case // a small starting size is allocated. // Channel: The channel's buffer is initialized with the specified // buffer capacity. If zero, or the size is omitted, the channel is // unbuffered. func make(t Type, size ...IntegerType) Type
make函数也是分配内存空间的函数,但是它只能用于chan(通道)、map(字典)、slice(切片)。
make函数的一个参数是chan(通道)、map(字典)、slice(切片)中的一个类型。返回值是一个该类型的变量,不是指针。
三、有了new函数为什么还要make函数
首先,make函数返回值不是一个引用(可以理解为指针类型);
其次,new用于类型的内存分配,并把内存设置为零值,但make函数用于类型分配,内存的初始值不是零值。
针对,chan(通道)、map(字典)、slice(切片)三种类型,内存分配要求初始化不能为零值,所以只能使用make。