go语言中make和new有什么作用以及区别?
在Go语言中,make
和 new
是两个内置的函数(built-in functions),用于分配内存,但它们之间有显著的区别,主要体现在它们被用于不同类型的对象分配内存。
new
new
关键字用于分配内存。更确切地说,它分配了零值初始化的内存空间,并返回指向这个新分配类型的指针。它只用于内建的数据类型(如int、float64、struct等),或者任何类型的指针、切片、映射、通道、函数等类型。但是,new 不会为切片、映射或通道初始化内部数据结构,只会分配一个指向这些类型的零值的指针。
new
函数接受一个类型 Type 作为参数,并返回一个指向该类型新分配零值的指针 *Type。
语法如下:
# 完整语法
var ptr *Type = new(Type)
# 简写
ptr := new(Type)
这里的 Type
是一个类型, 变量 ptr
是一个指向该类型零值内存地址的指针。
实际编程中,通常我们会采用简写形式。
举个栗子,如下所示:
var ptr *int = new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2
也可以简写成
ptr := new(int)
// 现在 ptr 指向一个 int 类型的零值0
*ptr = 2
fmt.Println(*ptr) // 输出: 2
make
make
函数用于初始化内置的数据结构类型:切片(slice)、映射(map)和通道(channel)。它不仅分配了内存,还返回了初始化(非零)后的(内建的)值。
例如,对于切片,它返回了一个长度和容量都已初始化的切片;对于映射,它返回了一个空的映射(准备好接受键值对);
对于通道,它返回了一个可以进行通信的通道。
如下所示
slice := make([]Type, len, cap)
map := make(map[KeyType]ValueType)
channel := make(chan Type, capacity)
- []Type 表示切片的元素类型。
- len 是切片的长度。
- cap 是切片的容量(可选,默认为长度)。
- KeyType 是映射的键的类型。
- ValueType 是映射的值的类型。
- Type 是通道中元素的类型。
- capacity 是通道的容量(可选,对于无缓冲通道,容量为0)。
区别
- 用途:
new
用于分配任意类型的内存空间,并返回指向该空间的指针,它不会初始化内存;make
用于初始化切片、映射、通道等内建的数据结构类型。 - 返回值:
new
返回的是一个指向类型的指针;make
返回的是初始化后的(内建的)值,比如切片、映射或通道。 - 零值:
new
分配的类型被零值初始化;make
初始化的切片、映射和通道则不是零值,它们有特定的初始状态(比如,切片的长度和容量,空的映射,可以通信的通道)。 - 适用类型:
new
适用于所有类型;make
只适用于切片、映射和通道。
go语言中make和new有什么作用以及区别?的更多相关文章
- C语言中的system函数参数及其作用
函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用 system() ...
- c语言中%s与%c对读入字符串的区别
对于scanf函数,需求%s类型时,\n是不会影响scanf内容的对于需求%c类型时,\n也是字符,自然会有影响.
- 汇编语言中,SP,BP ,SI,DI作用?
这个很简单: sp:表示栈顶指针,指向栈顶地址.与SS相配合使用.ss为栈段. bp:是基址指针,段地址默认在SS中.可以定位物理地址,比如:"mov ax,[bp+si+6]/mov ax ...
- c语言中break continue goto return和exit的区别 联系(筛选奇数和goto求和)
break 一般你是用于循环和switch语句中,执行break,退出循环,如果是多层循环,那么退出的当前的循环. 如果循环结构中有switch语句,而switch语句中有break 那么不会直接退出 ...
- c语言中malloc realloc 和calloc的联系与区别
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...
- models语言中filter和all取数据有什么区别
转自:http://www.bubuko.com/infodetail-1882394.html rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数 ...
- 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别
printf语法: #include <stdio.h>int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式 ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
- c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
随机推荐
- Solution Set - “女孩是瑰宝我心动一丝不苟”
目录 0.「NOI Simu.」静态顶树 1.「NOI Simu.」祖先 2.「NOI Simu.」睡眠 3.「JLOI 2008」「洛谷 P3881」CODES 4.「ARC 163A」Divide ...
- CDS标准视图:维护策略数据 I_MaintenanceStrategyData
视图名称:维护策略数据 I_MaintenanceStrategyData 视图类型:基础视图 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IMAINTSTRATD ...
- unordered_map比map慢?
先说结论:unordered_map不维护键的顺序,因此不能按顺序访问元素,因此如果你需要遍历表时若选用unordered_map就肯定比map慢 1. 数据结构与底层实现 unordered_map ...
- java线程用法和区别
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务.但是当前正在被服务的线程可能觉得cpu的服务质量不够 ...
- 配置教程-jdk-tomcat-maven
二.下载并安装JDK 选择一个适合自己的JDK版本下载并安装即可,具体流程不详述. 二.环境变量配置 1.右键桌面上"我的电脑">>"属性",在弹出 ...
- 在OERV也可以玩MC(下)
话接上回,上期讲述了在OERV安装HMCL的历程,这期讲讲HMCL的打包. Show openEuler:24.09 / HMCL - 开源软件构建与测试.在这个网站里,可以看到有好几个文件, ...
- golang学习链接
GitHub入门: https://github.com/rubyhan1314/Golang-100-Days Golang中国: https://www.qfgolang.com/
- 学弟一看就会的RDKX5模型转换及部署,你确定不学?
作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 宿主机环境:WSL2-Ubuntu22.04+Cuda12.6.D-Robotics-OE 1.2.8.Ubun ...
- 深入剖析Vue框架:从基础到未来趋势
深入剖析Vue框架:从基础到未来趋势 Vue 框架简介 Vue.js 是一款用于构建用户界面的 JavaScript 框架 ,它基于标准 HTML.CSS 和 JavaScript 构建,并提供了一套 ...
- SpringBoot利用@Async注解实现异步调用
前言:异步编程是让程序并发运行的一种手段,使用异步编程可以大大提高我们程序的吞吐量,减少用户的等待时间.在Java并发编程中实现异步功能,一般是需要使用线程或者线程池.而实现一个线程,要么继承Thre ...