Golang make vs new

文章目录

  • 1.简介
  • 2.区别
  • 3.new 可以初始化 slice,map 和 channel 吗?
  • 4.make 可以初始化其他类型吗?
  • 5.小结
  • 参考文献

1.简介

在 Go 语言中,make 和 new 是两个用于创建对象的内建函数,但它们有着不同的用途和适用范围。

make 「只用于」创建(分配内存并初始化) slice、map 和 chan 类型的对象,并返回对象本身。

函数原型:

func make(t Type, size ...IntegerType) Type

使用示例:

// 创建一个初始长度为 5 容量也为 5 的切片
s := make([]int, 5)
// 创建一个初始长度为 0 容量也为 5 的切片
s := make([]int, 0, 5)// 创建一个映射
m := make(map[string]int)
// 创建一个映射,并给定一个容量提示
m := make(map[string]int, hint)// 创建无缓冲信道
ch := make(chan int)
// 创建容量为 10 的有缓冲信道
ch := make(chan int, 10)

new 可用于任意类型的分配内存并置为零值,返回指向对象的指针。

函数原型:

// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
func new(Type) *Type

使用示例:

// 创建一个指向 int 类型的零值的指针
p := new(int)// 创建一个指向结构体类型的零值的指针
type Point struct {X, Y int
}
p := new(Point)

2.区别

make 和 new 都是內建函数,都是堆上分配内存。

(1)作用不同。

make 既分配内存,也初始化内存,new 只是申请内存,将内存清零,并没有初始化内存。

(2)作用对象不同。

make 只用于 slice、map 以及 channel 的初始化,而 new 可用于任意类型的内存分配。

(3)返回不同。

make 返回的是对象本身,而 new 返回的是指向对象的指针。

3.new 可以初始化 slice,map 和 channel 吗?

不可以。

因为 new 只是申请对应类型的内存并返回指向内存的指针,不做任何初始化操作。

所以我们使用 new 去创建上面几种类型的对象,实际上获得的是对应类型的零值(nil)。

// 先取值,因为 new 返回的是指针。
s := *new([]int)
m := *new(map[int]int)
ch := *new(chan int)// 等同于
var s []int
var m map[int]int
var ch chan int

对于零值 slice,可以使用 append 追加元素,append 会调用 mallocgc 申请到一块内存,并返回一个新的切片。

对于零值 map,new 没有对 map 做创建桶等初始操作,所以当我们添加键值对的时候会 panic,查询和删除不存在的 key 时不会引发 panic,因为查询和删除都要查找桶和 key,如果没有对应的桶和 key,查询返回零值,删除则不做操作。

对于零值 channel,new 没有对 channel 的缓冲区开辟内存空间以及更多的内部初始化操作,所创建的 channel 始终是 nil,往里面发送或从里面接收数据都会引发 panic。

4.make 可以初始化其他类型吗?

make 除了创建 slice、map 和 channel,可以初始化其他类型吗,如 int, string?

不可以,编译报错,因为 make 没有对其他类型提供相应的底层方法。

// invalid argument: cannot make int; type must be slice, map, or channel
i := make(int)

5.小结

make 和 new 都是 Golang 的内建函数,都用于创建对象,但是二者有着不同的作用。

总体来说,make 主要用于创建引用类型的数据结构,并进行初始化,而 new 主要用于创建值类型的实例。在实际使用时,根据具体需求选择使用 make 或 new。


参考文献

Go make 和new 的区别- 掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DLLNotFoundException:xxx tolua... 错误打印

DLLNotFoundException:xxx tolua... 错误打印 一、DLLNotFoundException介绍二、Plugins文件夹文件目录结构如下: 三、Plugins中的Android文件夹四、Plugins中的IOS文件夹这里不说了没测试过不过原理应该也是选择对应的平台即可五、Plugins中的x86和X86_64文件夹 一…

浅学JWT跨域认证

Json Web令牌简称JWT JWT的使用 加入依赖 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.3.0</version> </dependency> 测试案例 Test //生成token void jwtdemo01(){Calendar in…

【机器学习】模式识别

1 概述 模式识别&#xff0c;简单来讲&#xff0c;就是分类问题。 模式识别应用&#xff1a;医学影像分析、人脸识别、车牌识别、遥感图像 2 模式分类器 分类器的分类&#xff1a;线性分类器、非线性分类器、最近邻分类器 2.1 分类器的训练&#xff08;学习&#xff09;过…

Featured Based知识蒸馏及代码(3): Focal and Global Knowledge (FGD)

文章目录 1. 摘要2. Focal and Global 蒸馏的原理2.1 常规的feature based蒸馏算法2.2 Focal Distillation2.3 Global Distillation2.4 total loss3. 实验完整代码论文: htt

C语言中关于指针的理解

#include <stdio.h> int main() {int a11;int *p&a; //因为a是整型的&#xff0c;所以我们定义指针p的时候要和a的类型一样char b;char *pa&b; //同理&#xff0c;b是字符型&#xff0c;所以这里的pa也要用字符型return 0; }因为*p指向的是地址&…

Pytorch项目,肺癌检测项目之四

# 安装图像处理 的两个包 simpleITK 和 ipyvolume # 安装缓存相关的两个包 diskcache 和 cassandra-driver import gzip from diskcache import FanoutCache, Disk from cassandra.cqltypes import BytesType from diskcache import FanoutCache,Disk,core from diskcache…

LabVIEW在横向辅助驾驶系统开发中的应用

LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展&#xff0c;越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统&#xff08;ADAS&#xff09;中的横向辅助驾驶进行深入研究。在这项研究中&#xff0c;LabVIEW作为一个强大的系…

刷题第五十一天 84. 柱状图中最大矩形

好难&#xff0c;看解析&#xff1a; # 双指针 class Solution:def largestRectangleArea(self, heights: List[int]) -> int:size len(heights)# 两个DP数列储存的均是下标indexmin_left_index [0] * sizemin_right_index [0] * sizeresult 0# 记录每个柱子的左侧第一…

【并发设计模式】聊聊两阶段终止模式如何优雅终止线程

在软件设计中&#xff0c;抽象出了23种设计模式&#xff0c;用以解决对象的创建、组合、使用三种场景。在并发编程中&#xff0c;针对线程的操作&#xff0c;也抽象出对应的并发设计模式。 两阶段终止模式- 优雅停止线程避免共享的设计模式- 只读、Copy-on-write、Thread-Spec…

ubuntu常用指令

Ubuntu是一个基于Linux的操作系统&#xff0c;它使用了大量的命令行指令。这些指令对于管理系统、处理文件、监控资源和执行各种任务都非常有用。以下是一些常用的Ubuntu命令&#xff1a; 系统管理 sudo&#xff1a;提供管理员权限执行命令&#xff08;例如 sudo apt update&a…

vmware安装中标麒麟高级服务器操作系统软件 V7.0操作系统

vmware安装中标麒麟高级服务器操作系统软件 V7.0操作系统 1、下载中标麒麟高级服务器操作系统软件 V7.0镜像2、安装中标麒麟高级服务器操作系统软件 V7.0操作系统 1、下载中标麒麟高级服务器操作系统软件 V7.0镜像 官方提供使用通道 访问官网 链接: https://www.kylinos.cn/ 下…

PHP之Trait理解, Trait介绍

一、来源 自 PHP 5.4.0 起&#xff0c;PHP 实现了一种代码复用的方法&#xff0c;称为 trait。 Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制&#xff0c;使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和…

C/C++图型化编程

一、创建图形化窗口&#xff1a; 1.包含头文件&#xff1a; graphics.h:包含已经被淘汰的函数easyx.h:只包含最新的函数 2.两个函数就可以创建窗口&#xff1a; 打开&#xff1a;initgraph(int x,int y,int style);关闭&#xff1a;closegraph(); 3.窗口坐标的设置&#…

2023年浙大城市学院新生程序设计竞赛(同步赛)G

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先想法非常单一&#xff0c;一定是去枚举操作点&#xff0c;然后看它染白和不染的价值差值 也就是说&#xff0c;把一个黑色结点染白之后&#xff0c;对哪些结点的价值会影响 不难想象其实就是操作结点的子树和该点连通的…

5_js数组常用函数与let与const关键字

var 语句 用于声明一个函数范围或全局范围的变量。 1.1 const修饰 const&#xff1a;常量的值是无法改变的&#xff0c;也不能被重新声明。 PI&#xff1a;3.1415926.... 因为变量你修改值&#xff0c;就是等于把引用地址也修改了。 //申明不可变的值 const number 42; n…

在 linux 服务器上安装Redis数据库

先打开我们的Linux服务器 终端执行 安装redis sudo yum install redis然后 他会提示你要占多少磁盘空间 例如 我这里是 1.7 M 没问题就 y 然后回车就可以了 然后 我们这里执行 redis-cli --version这样 就能看到版本了 然后 我们可以根据版本选择启动命令 使用systemctl命…

SpringMVC:整合 SSM 上篇

文章目录 SpringMVC - 03整合 SSM 上篇一、准备工作二、MyBatis 层1. dao 层2. service 层 三、Spring 层四、SpringMVC 层五、执行六、说明 SpringMVC - 03 整合 SSM 上篇 用到的环境&#xff1a; IDEA 2019&#xff08;JDK 1.8&#xff09;MySQL 8.0.31Tomcat 8.5.85Maven…

期末加油站-图像处理期末知识点汇总

第三章&#xff1a;图像增强 一、概念 1.图像增强是通过某种技术有选择地突出对某一具体应用有用的信息&#xff0c;削弱或抑制一些无用的信息。 2. 图像增强处理不是无损处理&#xff0c;不能增加原图像的信息。 3. 图像增强按所处理的对象不同可分为&#xff1a; 灰度图像增…

用C的递归函数求n!-----(C每日一编程)

用递归函数求n&#xff01; 有了上面这个递归公式就能写C代码了。 参考代码&#xff1a; int fac(int n) {if (n 1 || n 0)return 1;else return n * fac(n - 1); } void main() {int n;scanf("%d",&n);int f fac(n);printf("\n%d!%d\n", n, f); …

Druid源码阅读-DruidStatInterceptor实现

上次我们在druid-spring-boot-starter里面看到有一个DruidSpringAopConfiguration的配置类&#xff0c;然后引入了DruidStatInterceptor这样一个切面逻辑。今天我们就来看一下这个类的实现。 DruidStatInterceptor 这个类的包路径下入com.alibaba.druid.support.spring.stat。…