在Go语言中,makenew 是两个内置的函数(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有什么作用以及区别?的更多相关文章

  1. C语言中的system函数参数及其作用

    函数名: system 功   能: 发出一个DOS命令  用   法: int system(char *command);  system函数已经被收录在标准c库中,可以直接调用 system() ...

  2. c语言中%s与%c对读入字符串的区别

    对于scanf函数,需求%s类型时,\n是不会影响scanf内容的对于需求%c类型时,\n也是字符,自然会有影响.

  3. 汇编语言中,SP,BP ,SI,DI作用?

    这个很简单: sp:表示栈顶指针,指向栈顶地址.与SS相配合使用.ss为栈段. bp:是基址指针,段地址默认在SS中.可以定位物理地址,比如:"mov ax,[bp+si+6]/mov ax ...

  4. c语言中break continue goto return和exit的区别 联系(筛选奇数和goto求和)

    break 一般你是用于循环和switch语句中,执行break,退出循环,如果是多层循环,那么退出的当前的循环. 如果循环结构中有switch语句,而switch语句中有break 那么不会直接退出 ...

  5. c语言中malloc realloc 和calloc的联系与区别

    (1)C语言跟内存分配方式 <1>从静态存储区域分配.       内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...

  6. models语言中filter和all取数据有什么区别

    转自:http://www.bubuko.com/infodetail-1882394.html rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数 ...

  7. 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    printf语法: #include <stdio.h>int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式 ...

  8. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  9. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  10. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

随机推荐

  1. Solution Set - “女孩是瑰宝我心动一丝不苟”

    目录 0.「NOI Simu.」静态顶树 1.「NOI Simu.」祖先 2.「NOI Simu.」睡眠 3.「JLOI 2008」「洛谷 P3881」CODES 4.「ARC 163A」Divide ...

  2. CDS标准视图:维护策略数据 I_MaintenanceStrategyData

    视图名称:维护策略数据 I_MaintenanceStrategyData 视图类型:基础视图 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IMAINTSTRATD ...

  3. unordered_map比map慢?

    先说结论:unordered_map不维护键的顺序,因此不能按顺序访问元素,因此如果你需要遍历表时若选用unordered_map就肯定比map慢 1. 数据结构与底层实现 unordered_map ...

  4. java线程用法和区别

    从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列).并且在某一时刻cpu只为ready queue中位于队列头部的线程服务.但是当前正在被服务的线程可能觉得cpu的服务质量不够 ...

  5. 配置教程-jdk-tomcat-maven

    二.下载并安装JDK 选择一个适合自己的JDK版本下载并安装即可,具体流程不详述. 二.环境变量配置 1.右键桌面上"我的电脑">>"属性",在弹出 ...

  6. 在OERV也可以玩MC(下)

      话接上回,上期讲述了在OERV安装HMCL的历程,这期讲讲HMCL的打包.   Show openEuler:24.09 / HMCL - 开源软件构建与测试.在这个网站里,可以看到有好几个文件, ...

  7. golang学习链接

    GitHub入门: https://github.com/rubyhan1314/Golang-100-Days Golang中国: https://www.qfgolang.com/

  8. 学弟一看就会的RDKX5模型转换及部署,你确定不学?

    作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 宿主机环境:WSL2-Ubuntu22.04+Cuda12.6.D-Robotics-OE 1.2.8.Ubun ...

  9. 深入剖析Vue框架:从基础到未来趋势

    深入剖析Vue框架:从基础到未来趋势 Vue 框架简介 Vue.js 是一款用于构建用户界面的 JavaScript 框架 ,它基于标准 HTML.CSS 和 JavaScript 构建,并提供了一套 ...

  10. SpringBoot利用@Async注解实现异步调用

    前言:异步编程是让程序并发运行的一种手段,使用异步编程可以大大提高我们程序的吞吐量,减少用户的等待时间.在Java并发编程中实现异步功能,一般是需要使用线程或者线程池.而实现一个线程,要么继承Thre ...