Go语言中new()和 make()的区别详解

作者:junjie 时间:2024-05-22 17:45:33 

概述

Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。

new 的主要特性

首先 new 是内建函数,你可以从 http://golang.org/pkg/builtin/#new 这儿看到它,它的定义也很简单:


func new(Type) *Type

官方文档对于它的描述是:


内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针

根据这段描述,我们可以自己实现一个类似 new 的功能:


func newInt() *int {
  var i int
  return &i
}

someInt := newInt()

我们这个函数的功能跟 someInt := new(int) 一模一样。所以在我们自己定义 new 开头的函数时,出于约定也应该返回类型的指针。

make 的主要特性

make 也是内建函数,你可以从 http://golang.org/pkg/builtin/#make 这儿看到它,它的定义比 new 多了一个参数,返回值也不同:


func make(Type, size IntegerType) Type

官方文档对于它的描述是:

内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型,具体说明如下:


Slice: 第二个参数 size 指定了它的长度,它的容量和长度相同。
你可以传入第三个参数来指定不同的容量值,但必须不能比长度值小。
比如 make([]int, 0, 10)

Map: 根据 size 大小来初始化分配内存,不过分配后的 map 长度为 0,如果 size 被忽略了,那么会在初始化分配内存时分配一个小尺寸的内存

Channel: 管道缓冲区依据缓冲区容量被初始化。如果容量为 0 或者忽略容量,管道是没有缓冲区的

总结

new 的作用是初始化一个指向类型的指针(*T),make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。

标签:Go语言,new(),make(),区别
0
投稿

猜你喜欢

  • vue2项目中封装echarts地图的优雅方法

    2024-05-13 09:44:55
  • Go语言映射内部实现及基础功能实战

    2024-04-27 15:39:30
  • 基于Python实现的扫雷游戏实例代码

    2023-06-26 12:29:34
  • vuex中mapState思想应用

    2023-07-02 16:33:55
  • flask循环导入的问题解决

    2023-10-01 10:28:52
  • pandas or sql计算前后两行数据间的增值方法

    2022-08-08 09:36:30
  • vue.js页面加载执行created,mounted的先后顺序说明

    2024-05-09 15:10:22
  • PHP图片上传类带图片显示

    2024-05-22 10:06:19
  • Python实现简单的可逆加密程序实例

    2022-12-18 10:39:56
  • python字符串中匹配数字的正则表达式

    2023-11-19 17:36:02
  • Python制作脚本帮女朋友抢购清空购物车

    2021-08-30 04:40:01
  • js中的for如何实现foreach中的遍历

    2024-04-29 13:19:37
  • python re库的正则表达式入门学习教程

    2023-05-31 13:03:56
  • Python中的异常处理相关语句基础学习笔记

    2021-10-18 00:54:50
  • 深入浅析python的第三方库pandas

    2021-06-05 03:13:03
  • js放大镜放大图片效果

    2024-04-30 08:51:38
  • python高级特性和高阶函数及使用详解

    2022-09-17 20:13:50
  • python多线程扫描端口示例

    2022-06-28 23:18:58
  • 用selenium解决滑块验证码的实现步骤

    2021-06-02 01:44:39
  • python如何实现数据的线性拟合

    2023-10-08 01:56:01
  • asp之家 网络编程 m.aspxhome.com