要彻底理解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中的大内存,导致不能及时释放造成内存泄露危险.

golang的内存模型与new()与make()的更多相关文章

  1. Golang内存模型

    Ref: https://golang.org/ref/mem 简介 golang内存模型,主要说明了如下问题.在一个goroutine中读取变量,而该变量是由其他goroutine赋值的,这种情况下 ...

  2. golang 内存模型

    1,是什么 是一套规范.内存操作指导 解决多线程编程的 程序的 原子性,有序性,可见性(主要)的问题. 多核操作系统,会存在缓存不一致的情况,说到底是一个同步的问题. 2, 内容 内存模型,除了定义了 ...

  3. golang学习笔记 ---面向并发的内存模型

    Go语言是基于消息并发模型的集大成者,它将基于CSP模型的并发编程内置到了语言中,通过一个go关键字就可以轻易地启动一个Goroutine,与Erlang不同的是Go语言的Goroutine之间是共享 ...

  4. Golang面向并发的内存模型

    Import Advanced Go Programming 1.5 面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中 ...

  5. 从GO内存模型与调用协议理解defer closure的坑

    资料参考: 官网defer介绍: https://blog.golang.org/defer-panic-and-recover 深入解析go: 多值返回: https://tiancaiamao.g ...

  6. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  7. Java内存模型深度解析:总结--转

    原文地址:http://www.codeceo.com/article/java-memory-7.html 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会 ...

  8. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  9. 浅析java内存模型--JMM(Java Memory Model)

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

随机推荐

  1. 09_platform-tools简介&常见adb指令

    SDK下面的文件夹说明add-ons 附加的附属的一些信息.docs Android开发的帮助文件.extras 支持的jar包,高版本兼容底版本.google usb的驱动.platforms 存放 ...

  2. 在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案

    ecshop 问题一:商城首页报错 Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\i ...

  3. 【MVC】关于Action返回结果类型的事儿(上)

    一. ASP.NET MVC 1.0 Result 几何? Action的返回值类型到底有几个?咱们来数数看. ASP.NET MVC 1.0 目前一共提供了以下十几种Action返回结果类型: 1. ...

  4. Gestures_Article_4_0

    Technical Article Windows Phone 7™ Gestures Compared Lab version: 1.0.0 Last updated: August 25, 201 ...

  5. Android代码写View

    1.Java Code package com.fish.helloworld; import android.app.Activity; import android.content.Context ...

  6. 比特币钱包应用breadwallet源码

    breadwallet是一款安全.可靠和便捷的比特币钱包,可使用户免于恶意软件和其他应用中常见的安全问题的骚扰,充分利用了iOS提供的安全功能,包括AES硬件加密.app沙盒和数据保护.代码签名以及k ...

  7. 两张table数据同步--使用触发器

    数据同步, 如果每天同步一次的话可以使用SSIS,跑JOB等,可以同步不同的DB的数据: 实时的可以使用触发器,在同一个DB中(或者DB Link): USE [test] GO IF EXISTS( ...

  8. [leetcode]_K Sum 问题

    问题:K Sum问题是一个问题系列,在一个数组中找K个数的和能够满足题目中要求.从2 Sum 到 3 Sum , 3 Sum Clozet , 4 Sum..解法虽一开始不容易想到,但get到解题技能 ...

  9. php文件上传的例子

    1.上传表单 upload.html 程序代码 [html] view plaincopy <form enctype="multipart/form-data" actio ...

  10. php怎么删除文件

    php怎么删除文件 删除文件很简单只要使用unlink(文件名)就可以了.