Go提供了两种分配原语,即new和make。它们所做的事情是不一样的,所应用的类型也不同。

new用来分配内存,但与其他语言中的同名函数不同,它不会初始化内存,只会将内存置零;也就是说,new(T)会为类型为T的新项分配已置零的内存空间,并返回他的地址,也就是一个类型为*T的值。用Go的术语来说,它返回一个指针,改指针指向新分配的,类型为T的零值;

make的目的不同于new,它只用于slice,map,channel的创建,并返回类型为T(非指针)的已初始化(非零值)的值;出现这种差异的原因在于,这三种类型本质上为引用类型,它们在使用前必须初始化;

小结:
new和make都在堆上分配内存,但是它们的行为不同,适用于不同的类型。

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

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

换言之,new 函数分配内存,make 函数初始化;下图给出了区别:

通过实验,可以更直观的查看两者之间的区别

package mainimport "fmt"func main() {p := new([]int) //p == nil; with len and cap 0fmt.Println(p)v := make([]int, 10, 50) // v is initialed with len 10, cap 50fmt.Println(v)/*********Output****************&[][0 0 0 0 0 0 0 0 0 0]*********************************/(*p)[0] = 18        // panic: runtime error: index out of range// because p is a nil pointer, with len and cap 0v[1] = 18           // ok}

golang new make 区别相关推荐

  1. golang PHP的区别,erlang和golang的区别

    Erlang和golang的区别: 第一对锁的态度不同,第二对异步IO的态度不同,第三消息机制不同.Erlang对锁非常反感,认为变量不可变可以很大程度避免锁. Golang的观点是锁确实有很大的负担 ...

  2. Golang和Go语言之间有区别吗?

    go和golang之间有区别吗? go和golang之间没有区别,go就是golang,全名是golang,简称go语言. Go(又称 Golang)是 Google 的 Robert Griesem ...

  3. Golang与C#之switch区别

    2019独角兽企业重金招聘Python工程师标准>>> Golang与C#之switch区别 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言. C#是微软 ...

  4. Golang的值类型和引用类型的范围、存储区域、区别

    常见的值类型和引用类型分别有哪些? 值类型:基本数据类型 int 系列, float 系列, bool, string .数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变 ...

  5. Golang 方法接收者为值与指针的区别

    文章目录 1.方法语法格式 2.方法接收者为值与指针的区别 3.小结 参考文献 1.方法语法格式 Golang 中同时有函数和方法.方法是一个包含了接收者(receiver)的函数,receiver ...

  6. golang中如何比较struct,slice,map是否相等以及几种对比方法的区别

    一.前言 对比两个struct或者map,slice是否相等是大家经常会有的需求,想必大家也都接触过很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等. 这么多 ...

  7. golang封装mysql涉及到的包以及sqlx和gorm的区别

    一.前言 本篇是搬运之前的笔记,刚用golang的时候,看到mysql的封装部分,总是很好奇为什么会用到那么多的包,例如: "database/sql" "github. ...

  8. 【Golang 中的 type A = XXX 与 type A XXXX的区别】

    Golang 中的 type A = XXX 与 type A XXXX的区别 先上代码 运行结果 结论 先上代码 package mainimport ("fmt" ) type ...

  9. golang: make 与 new 的区别

    golang 中有两个内置函数可以用来在堆上分配内存,分别是 mak() 和 new(),这篇文章中会简要介绍下这两个函数的区别,以及这两个函数分别在什么情况下使用. 下面先看下 golang 中对这 ...

最新文章

  1. Faiss教程:索引(2)
  2. Typescript在Vue项目中的使用
  3. 透视大数据时代下的物联网生活
  4. KEIL-MDK编译错误问题解决办法
  5. 三种流行防火墙配置方案分析与对比
  6. 调用视频流html代码,如何将/“流”视频文件发送到HTML5视频标签
  7. Cisco ××× 完全配置指南-连载-SSL ×××
  8. excel拼接数据宏
  9. 性能强悍的MCU,主频干到GHz
  10. LINUX编译mate-desktop/pluma-1.26.0文本编辑器
  11. matlab俄罗斯方块说明,俄罗斯方块MATLAB版的代码
  12. Day11 JaseSE File类的使用
  13. CAN FD实战之CAN FD应用领域及CAN迁移至CAN FD的策略
  14. 基于snowflake的序列号生成器
  15. SPSS——相关分析——Pearson简单相关系数
  16. 区块链是什么通俗解释_区块链是什么?1个例子通俗解释,小白秒懂!
  17. 数字图像处理与Python实现笔记之图像小波变换与多分辨率
  18. 一文搞懂Grid 布局
  19. 【小技巧】使用百度搜索引擎搜指定站点内容
  20. oracle日期查询

热门文章

  1. 模组使用之APN、CS、PS、小区选择、小区重选、小区切换介绍
  2. MDK出现红叉,程序编译正常没有错误
  3. “勒索病毒”为什么盯上了比特币?
  4. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
  5. 保护8亿终端 阿里聚安全携手信通院打造B2C资金安全闭环
  6. Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
  7. 伟世盾安助国电高级培训中心实现一网双管
  8. postman使用介绍
  9. __getitem__()
  10. 《Python数据分析》-Ch01 Python 程序库入门