Go 语言中 new 和 make 都是内置函数,用于内存的分配,本文主要简述二者使用上的异同与特性。spring
举个例子:sql
func main() { var i *int *i = 1 fmt.Println(*i)}
上面的程序并不会打印1,而会抛 panic 异常,由于i是一个引用类型,须要给它分配内存空间,通俗来讲就是指针(内存地址)须要指向一片内存空间才有意义。
mybatis
为 i 分配内存:架构
func main() { var i *int i = new(int) *i = 1 fmt.Println(*i)}
用 new 内置函数为 i 分配内存空间,并返回该内存空间的地址,即指针,new 函数格式以下:
app
func new(Type) *Type
可知,new 为每一个类型分配一片内存空间,初始化为 0 并返回该内存空间的地址。
分布式
new 的内存分配示意图:ide
其实要说明一点的就是,new 不经常使用,咱们经常会经过结构体的字面量达到 new 的效果,并且这样写也比较优雅:函数
man := &People{Name: "zhangchenghui", Age: 18, Sex: "男"}
make 也是分配内存分配,可是仅限 chan、map、slice 的内存建立,并返回其类型的引用,这一点很重要, chan、map、slice 其自己已是引用类型了,因此make不须要再返回其指针,引用类型的本质就是指针!例如:源码分析
type i *int;
如上,i 就是一个自定义的引用类型,其类型是一个 int 类型的指针。
ui
Make 内置函数格式:
func make(t Type, size ...IntegerType) Type
make 的内存分配示意图:
近期热文
Mybatis-spring源码分析之注册Mapper Bean
https://mp.weixin.qq.com/s/_FTH5GeWEo8IV9oOiqD3MA