go语言学习之路五:Go语言内存分配机制make&new

Go有两种分配内存的机制,规则很简单,下面来简单介绍一下。

1、new函数

New()函数可以给一个值类型的数据分配内存(不知道什么是值类型请前往切片那一部分),调用成功后返回一个初始化的内存块指针,同时该类型被初始化为0值,原型定义:

func new(Type) * Type

new是一个分配内存的内置函数,但是不同于其他语言中new所做的工作,它只是将内存清零,而不是初始化内存。

2、make函数

Make()函数用于给引用类型分配内存空间,比如:slice,map,channal等,这里需要注意的一点是make()创建的是一个引用类型的对象,而不是一个内存空间的指针。Make()函数原型:

func make(Type,size IntegerType)Type

参数Type必须是一个引用类型(slice,map,channal);参数IntegerType指定要创建的该对象的个数。和new不同的是make调用成功是返回一个对象,而不是一个内存空间的指针。

new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)

package main

import (

"fmt"

)

func main() {

p := new([]int)

fmt.Println(p)     //输出&[],p本身是一个地址

s := make([]int, 1)

fmt.Println(s)     //输出[0],s本身是一个slice对象,其内容默认为0

}

通过这个例子可以看出,当对slice,map以及channel进行初始化时,使用make比new方式要好,而其他形式的则利用new进行初始化