当前位置: 首页 > 编程笔记 >

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

滕夜洛
2023-03-14
本文向大家介绍Go语言中new()和 make()的区别详解,包括了Go语言中new()和 make()的区别详解的使用技巧和注意事项,需要的朋友参考一下

概述

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)。

 类似资料:
  • 本文向大家介绍C语言中fgets和fscanf区别详解,包括了C语言中fgets和fscanf区别详解的使用技巧和注意事项,需要的朋友参考一下 C语言中fgets和fscanf区别详解 一、作用上的大概区别: 二、举个例子:把a.txt文件中的内容复制到b.txt。 a.txt中的内容(第一行中“我爱你小白”和“开玩笑”中间有个空格,每行的最后都有回车): 1、使用fgets读取a.txt文件并写

  • 本文向大家介绍C语言中const和C++中的const 区别详解,包括了C语言中const和C++中的const 区别详解的使用技巧和注意事项,需要的朋友参考一下 C语言中const和C++中的const 区别详解 C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有

  • 本文向大家介绍Go和Python编程语言之间的区别,包括了Go和Python编程语言之间的区别的使用技巧和注意事项,需要的朋友参考一下 走 Go是一种程序语言,由Robert Griesemer,Rob Pike和Ken Thompson于2007年在Google开发,并于2009年开源。Go的开发旨在简化并发编程和环境采用。 Python Python是Guido van Rossum在1991

  • 我对数据库开发非常陌生,因此我对以下示例有一些疑问: 函数f1()-语言sql 函数f2()-语言plpgsql > 这两个函数都可以像或一样调用。 如果我调用选择f1('world'),输出将是: 并为输出: 错误:查询没有结果数据的目的地提示:如果要丢弃SELECT的结果,请改为使用PERFORM。上下文:PL/pgSQL函数f11(字符变化)第2行SQL语句 ********** 错误 **

  • 本文向大家介绍python中new和init__的区别?相关面试题,主要包含被问及python中new和init__的区别?时的应答技巧和注意事项,需要的朋友参考一下 init为初始化方法,new方法是真正的构造函数 new是实例创建时被调用的,它的任务是创建并返回这个实例,是静态方法 —init__是实例创建之后被调用的,然后设置对象属性的一些初始值

  • 本文向大家介绍详解C语言中getgid()函数和getegid()函数的区别,包括了详解C语言中getgid()函数和getegid()函数的区别的使用技巧和注意事项,需要的朋友参考一下 C语言getgid()函数:取得组识别码函数 头文件: 定义函数: 函数说明:getgid()用来取得执行目前进程的组识别码。 返回值:返回组识别码 范例 执行: C语言getegid()函数:获得组识别码 头文