golang的内存模型与new()与make()
来源:互联网 发布:java选课源代码 编辑:程序博客网 时间:2024/06/09 17:40
要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型:
|低地址|text|data|bss|heap-->|unused|<--stack|env|高地址|
其中:
(1)text存储程序主体,即机器指令.
(2)data,bss存储全局变量, data存储初始化的全局变量. bss存储未初始化的全局变量. bss全称Block start by symbol, 以符号开始的块.
(3)heap: 动态内存堆
(4)stack: 函数调用栈.
(5)env: 程序执行环境变量.
------------------------------------------------
value types: variable point direct to value, 即变量在函数调用栈中的内容就是value.
reference types: variable point to reference toward heap, 即变量在函数调用栈中的内容是reference, 指向heap中的某块内存.
赋值操作=或:=, 都是将某个variable在函数调用中栈中的内容复制给目标变量. 对于value types是复制值. 对于reference types是复制引用.
new()操作: 在函数调用栈中分配内存, 内容是目标类型的零值, 返回值是目标类型的指针.
make()操作: 先在动态内存堆分配内存, 内容也是目标类型的零值, 再在函数调用栈中分配内存, 内容是分配的堆地址, 返回值是目标类型的值.
注意: 一般来说,
new()用于value types
make()用于reference types.
但是, new()也可用于refrences types, 只是返回值是nil的指针. make()不可用于value types, 编译会出错: make(xxx) cannot make type xxx
对于非elementary(primitive) type,即非基本类型, new()等价于&Type{}, 但对于基本类型, 不支持&P{}语法, 就必须使用new()来创建指针.
对于初始化空值, make(Type)行人于Type{}, 但要初始化多值, 就必须使用make(Type, m)
以上原则更多体现在长变量声明long variable declaration, 与短变量声明short variable declaration. 对于后者, 更常使用new()与make()初始化.
---------------------------------------
由于reference types的特点, 容易造成某些陷阱, 例如: 多个reference指向heap中的大内存,导致不能及时释放造成内存泄露危险.
查看原文:http://www.zoues.com/2016/10/20/golang%e7%9a%84%e5%86%85%e5%ad%98%e6%a8%a1%e5%9e%8b%e4%b8%8enew%e4%b8%8emake/
- golang的内存模型与new()与make()
- golang-new与make
- golang new与make
- Golang中make与new的区别
- Golang — new与make
- 深入学习golang(4)—new与make
- 深入学习golang(4)—new与make
- new与make的区别
- Golang中new和make的区别
- Golang中new和make的区别
- Golang中new和make的区别
- golang中make和new的区别
- go 中 make 与 new 的区别
- golang make & new
- golang中new和make区别
- golang中new和make简析
- golang new和make学习笔记
- new 模型与模型::model()区别
- golang之defer
- 设计模式之观察者模式
- 驱动问题总结
- Golang基本数据类型,常量,标识符
- Golang语言和node.js的对比
- golang的内存模型与new()与make()
- Linux Ubuntu14.04在线安装配置Nginx
- Golang中一个不错的处理 JSON 的库 go-dproxy
- Golang 在 Baidu-FrontEnd 的应用之路
- Myeclipse10提高javaweb的技巧
- Gvim开发环境配置笔记--Windows篇(转)
- golang:channel
- GOLANG如何并发
- map 中删除指定元素