Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives)。对于初学者,这两者的区别也挺容易让人迷糊的。简单的说,new只分配内存,make用于slice,map,和channel的初始化。

1. new

这是一个用来分配内存的内建函数,但是与C++不一样的是,它并不初始化内存,只是将其置零。也就是说,new(T)会为T类型的新项目,分配被置零的存储,并且返回它的地址,一个类型为*T的值。在Go的术语中,其返回一个指向新分配的类型为T的指针,这个指针指向的内容的值为零(zero value)。注意并不是指针为零。

Go语言中的对象没有C++中的构造函数,如果用C来描述,Go中的new大概相当于:

T *t = (T*)malloc(sizeof(T))

memset(t, 0, sizeof(T))

其实,上面的描可能也不是很准确,也许用*t=zerovalue更准确。因为对于不同的数据类型,零值的意义是完全不一样的。比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串:

b := new(bool)

fmt.Println(*b)

i := new(int)

fmt.Println(*i)

s := new(string)

fmt.Println(*s)

输出:

false

0

注意最后有一个空字符串。

2. 初始化

很多时候,零值并不是一个好主意,我们需要做一些初始化。考虑如下结构体:

type Rect struct {

x, y float64

width, height float64

}

零值的Rect并没有多大用处,我们以下方式进行初始化:

rect3 := &Rect{0, 0, 100, 200}

rect4 := &Rect{width: 100, height: 200}

再申明一下,Go语言中没有C++中的构造函数,对象的创建一般交给一个全局的创建函数来完成:

func NewRect(x, y, width, height float64) *Rect {

return &Rect{x, y, width, height}

}

注意,这里与C/C++不同的是,返回一个局部变量的地址在Go语言中是绝对没有问题的;变量关联的存储在函数返回之后依然存在。

更直接的说,在Go语言中,如果一个局部变量在函数返回后仍然被使用,这个变量会从heap,而不是stack中分配内存。详细参考https://www.cnblogs.com/maji233/p/11048018.html

3. make

内建函数make(T, args)与new(T)的用途不一样。它只用来创建slice,map和channel,并且返回一个初始化的(而不是置零),类型为T的值(而不是*T)。之所以有所不同,是因为这三个类型的背后引用了使用前必须初始化的数据结构。例如,slice是一个三元描述符,包含一个指向数据(在数组中)的指针,长度,以及容量,在这些项被初始化之前,slice都是nil的。对于slice,map和channel,make初始化这些内部数据结构,并准备好可用的值。

例如,

make([]int, 10, 100)

分配一个有100个int的数组,然后创建一个长度为10,容量为100的slice结构,该slice引用包含前10个元素的数组。对应的,new([]int)返回一个指向新分配的,被置零的slice结构体的指针,即指向值为nil的slice的指针。

var p *[]int = new([]int)       // allocates slice structure; *p == nil; rarely useful

var v  []int = make([]int, 100) // the slice v now refers to a new array of 100 ints

// Unnecessarily complex:这种做法实在是很蛋疼

var p *[]int = new([]int)

*p = make([]int, 100, 100)

// Idiomatic:习惯的做法

v := make([]int, 100)

记住make只用于map,slice和channel,并且不返回指针。要获得一个显式的指针,使用new进行分配,或者显式地使用一个变量的地址。

出处:http://www.cnblogs.com/hustcat/

转载于:https://www.cnblogs.com/maji233/p/11048039.html

Golang中对new和make的理解相关推荐

  1. Golang中闭包的理解

    简介 参考博客: https://www.calhoun.io/what-is-a-closure/ https://blog.cloudflare.com/a-go-gotcha-when-clos ...

  2. 理解Golang中的nil

    参考: 有趣的面试题:Go语言中的nil比较 - 知乎 (zhihu.com) 理解Go语言的nil - 简书 (jianshu.com) Golang中的nil,没有人比我更懂nil! - 知乎 ( ...

  3. Golang中的自动伸缩和自防御设计

    Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...

  4. golang 函数传多个参数_关于Golang中方法参数的传递

    结构体声明 为了说明函数以及方法调用的过程,这里先定义一个struct,在下面的描述中会使用到它. type Person struct { Name string Age uint16 } 普通函数 ...

  5. golang中的http server和http client

    一.golang http server python中创建一个web服务器有python -m http.server golang中创建一个web服务器很简单. golang中有一个叫做http的 ...

  6. golang中,new和make的区别

    在golang中,make和new都是分配内存的,但是它们之间还是有些区别的,只有理解了它们之间的不同,才能在合适的场合使用. 简单来说,new只是分配内存,不初始化内存: 而make即分配又初始化内 ...

  7. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  8. Golang中unsafe.Sizeof()的问题

     编辑 删除 *今天看到一段代码感觉很奇怪...* 代码的如下 package mainimport "unsafe" const (a = "abc"b ...

  9. Golang中log日志包的使用

    文章目录 1.前言 2.log包介绍 3.log包的使用 3.1 日志输出方法 3.2 自定义创建日志对象 3.3 封装自定义日志包 3.4 log包进一步解析 1.前言 作为后端开发人员,日志文件记 ...

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

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

最新文章

  1. postman发送post请求,用request.getParameter()获取请求参数
  2. 刻意练习:LeetCode实战 -- Task21. 二叉树的最大深度
  3. UVA11817 Tunnelling the Earth(计算几何、经纬度转空间坐标、球面距离)
  4. 某短视频程序员吐槽:公司要求每天刷短视频的时长和绩效挂钩,这合理吗?网友:那某陌员工要按照奔现次数算绩效吗?...
  5. 闽南科技学院计算机分数线,2015年闽南科技学院美术专业录取分数线
  6. Windows Phone 7(WP7)开发 自订磁贴(深度链接)
  7. element ui select设置不显示不存在的项_appium—等待时间设置方法
  8. IBM T60网卡问题
  9. HLSL bytecode to GLSL编译器的第一步
  10. vue-cli设置跨域代理 + 开发/生成环境简单请求接口设置
  11. python-按照相同的顺序打乱
  12. 揭开均线系统的神秘面纱_揭开定价创造力的黑暗艺术神秘面纱
  13. 安卓手机安装运行谷歌三件套、googleplay收集表调查报告
  14. 正反向隔离装置(网闸)
  15. 小程序中maring-top、maring-left、maring-right、maring-bottom失效/没有用的原因及解决方案
  16. 三坐标检测基础知识之坐标系2021
  17. 每天一刷20200602
  18. 数据结构基础之图(上):图的基本概念
  19. simulator相关
  20. 邓亚萍的即刻搜索:推民生产品搜索曝光不良食品

热门文章

  1. OpenCV-图像处理(23、直方图均衡化)
  2. nyoj 最强DE 战斗力 (数论入门)
  3. nyoj1058部分和问题(简单基础易上手的dfs)
  4. 生成word_用Word生成员工信息表,单独生成独立文件,还能自动命名
  5. 如何在信用卡反欺诈检测中使用人工智能和机器学习
  6. 金融银行业机器学习—机遇、风险、案例
  7. MATLAB--高斯牛顿法
  8. android 替代map,Android为什么推荐使用SparseArray来替代HashMap?
  9. WWDC2019最值得看的十个视频
  10. 将大于2的偶数分解成两个素数之和