golang new make 区别
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 区别相关推荐
- golang PHP的区别,erlang和golang的区别
Erlang和golang的区别: 第一对锁的态度不同,第二对异步IO的态度不同,第三消息机制不同.Erlang对锁非常反感,认为变量不可变可以很大程度避免锁. Golang的观点是锁确实有很大的负担 ...
- Golang和Go语言之间有区别吗?
go和golang之间有区别吗? go和golang之间没有区别,go就是golang,全名是golang,简称go语言. Go(又称 Golang)是 Google 的 Robert Griesem ...
- Golang与C#之switch区别
2019独角兽企业重金招聘Python工程师标准>>> Golang与C#之switch区别 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能的编程语言. C#是微软 ...
- Golang的值类型和引用类型的范围、存储区域、区别
常见的值类型和引用类型分别有哪些? 值类型:基本数据类型 int 系列, float 系列, bool, string .数组和结构体struct,使用这些类型的变量直接指向存在内存中的值,值类型的变 ...
- Golang 方法接收者为值与指针的区别
文章目录 1.方法语法格式 2.方法接收者为值与指针的区别 3.小结 参考文献 1.方法语法格式 Golang 中同时有函数和方法.方法是一个包含了接收者(receiver)的函数,receiver ...
- golang中如何比较struct,slice,map是否相等以及几种对比方法的区别
一.前言 对比两个struct或者map,slice是否相等是大家经常会有的需求,想必大家也都接触过很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等. 这么多 ...
- golang封装mysql涉及到的包以及sqlx和gorm的区别
一.前言 本篇是搬运之前的笔记,刚用golang的时候,看到mysql的封装部分,总是很好奇为什么会用到那么多的包,例如: "database/sql" "github. ...
- 【Golang 中的 type A = XXX 与 type A XXXX的区别】
Golang 中的 type A = XXX 与 type A XXXX的区别 先上代码 运行结果 结论 先上代码 package mainimport ("fmt" ) type ...
- golang: make 与 new 的区别
golang 中有两个内置函数可以用来在堆上分配内存,分别是 mak() 和 new(),这篇文章中会简要介绍下这两个函数的区别,以及这两个函数分别在什么情况下使用. 下面先看下 golang 中对这 ...
最新文章
- Faiss教程:索引(2)
- Typescript在Vue项目中的使用
- 透视大数据时代下的物联网生活
- KEIL-MDK编译错误问题解决办法
- 三种流行防火墙配置方案分析与对比
- 调用视频流html代码,如何将/“流”视频文件发送到HTML5视频标签
- Cisco ××× 完全配置指南-连载-SSL ×××
- excel拼接数据宏
- 性能强悍的MCU,主频干到GHz
- LINUX编译mate-desktop/pluma-1.26.0文本编辑器
- matlab俄罗斯方块说明,俄罗斯方块MATLAB版的代码
- Day11 JaseSE File类的使用
- CAN FD实战之CAN FD应用领域及CAN迁移至CAN FD的策略
- 基于snowflake的序列号生成器
- SPSS——相关分析——Pearson简单相关系数
- 区块链是什么通俗解释_区块链是什么?1个例子通俗解释,小白秒懂!
- 数字图像处理与Python实现笔记之图像小波变换与多分辨率
- 一文搞懂Grid 布局
- 【小技巧】使用百度搜索引擎搜指定站点内容
- oracle日期查询
热门文章
- 模组使用之APN、CS、PS、小区选择、小区重选、小区切换介绍
- MDK出现红叉,程序编译正常没有错误
- “勒索病毒”为什么盯上了比特币?
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
- 保护8亿终端 阿里聚安全携手信通院打造B2C资金安全闭环
- Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
- 伟世盾安助国电高级培训中心实现一网双管
- postman使用介绍
- __getitem__()
- 《Python数据分析》-Ch01 Python 程序库入门