go:内存分配

Posted virgosnail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go:内存分配相关的知识,希望对你有一定的参考价值。

1. new 和 make

  二者堆上分配内存,但是它们的行为不同,适用于不同的类型;

  new 函数分配内存,make 函数初始化;

  new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构体,它相当于 &{};

  make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 channel;

1.1 两个在内存中的区别

  new([]int) 指向一个值为空的地址;

  make([]int,0) 指向一个空数组;

  技术图片

 

 

 

1.2 如何理解new、make、slice、map、channel的关系

  1.slice、map以及channel都是golang内建的一种引用类型,三者在内存中存在多个组成部分, 需要对内存组成部分初始化后才能使用,而make就是对三者进行初始化的一种操作方式;

  2. new 获取的是存储指定变量内存地址的一个变量,对于变量内部结构并不会执行相应的初始化操作, 所以slice、map、channel需要make进行初始化并获取对应的内存地址,而非new简单的获取内存地址;

以上是关于go:内存分配的主要内容,如果未能解决你的问题,请参考以下文章

细谈Go变量的内存分布

细谈Go变量的内存分布

细谈Go变量的内存分布

go语言学习笔记 — 基础 — 基本语法 — 常量与变量 — 变量的生命周期:变量逃逸分析 —— go编译器自动决定变量的内存分配方式(堆还是栈),提高程序运行效率

Go 内存分配

Go 内存分配