golang中new和make的区别

1. 先看一个例子

package mainimport "fmt"func main() {var a *int*a = 10fmt.Println(*a)
}

运行结果是啥呢?
image.png

问:为什么会报这个panic呢?
答:因为如果是一个引用类型,我们不仅要声明它,还要为它分配内存空间,否则我们赋值的 10 就无处安放。值类型的声明不需要我们分配内存空间,因为已经默认给我们分配好啦。

问:那么如何分配内存呢?
答:在使用a这个引用类型的变量之前给它分配内存内存即可。

package mainimport "fmt"func main() {var a *inta = new(int)*a = 10fmt.Println(*a)
}

问:听说对变量分配内存有new和make函数两种,我应该在对各种变量初始化和分配内存时用哪个呢?
答:在golang中的源码中已经做出了解释可以接着看后面的内容。

2. 源码中的描述

make函数用来对slicemap、和channel类型的初始化和分配内存。和new函数一样,第一个参数是一个类型而不是值;和new函数不一样的是make函数的返回类型和传入参数的类型一致,而new函数的返回类型是传入类型的指针。特定的结果依赖于传入的类型:

  • slice:size指定切片的长度,容量在不指定的情况下和长度相等。如果额外指定容量则容量可能和长度不相等。比如make([]int,0,10)分配了一个大小为10的底层数组,并返回一个长度为0、容量为10的切片,该切片由这个底层数组支持。
  • map:一个空的map被分配了足够的空间以容纳指定数量的元素。如果省略了大小,则会分配一个较小的起始大小。
  • 通道的缓冲区使用指定的缓冲区容量进行初始化。如果容量为0或者未指定大小,则通道是无缓冲的。

new函数用于分配内存。其第一个参数是一个类型,而不是一个值,返回的值是指向新分配的内存的指针,该内存的内容是该类型的零值。

// The make built-in function allocates and initializes an object of type
// slice, map, or chan (only). Like new, the first argument is a type, not a
// value. Unlike new, make's return type is the same as the type of its
// argument, not a pointer to it. The specification of the result depends on
// the type:
//
//	Slice: The size specifies the length. The capacity of the slice is
//	equal to its length. A second integer argument may be provided to
//	specify a different capacity; it must be no smaller than the
//	length. For example, make([]int, 0, 10) allocates an underlying array
//	of size 10 and returns a slice of length 0 and capacity 10 that is
//	backed by this underlying array.
//	Map: An empty map is allocated with enough space to hold the
//	specified number of elements. The size may be omitted, in which case
//	a small starting size is allocated.
//	Channel: The channel's buffer is initialized with the specified
//	buffer capacity. If zero, or the size is omitted, the channel is
//	unbuffered.
func make(t Type, size ...IntegerType) Type// 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

3. 两者的异同

相同点:

  1. new 和 make 都是用于内存的分配。
  2. new 用于给类型分配内存空间,并且变量的值为零。

不同点:

  1. make 只用于 chan,map,slice 的初始化。
  2. make 返回类型本身,new 返回指向类型的指针。

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

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

相关文章

Linux命令-权限管控

Linux命令-权限管控 目录 Linux命令-权限管控rootsu(switch user)sudo用户、用户组查看权限管控信息修改权限控制chmodchown 对于Linux中权限的讲解以及对权限的一些操作 root 超级管理员,拥有最大系统操作权限普通用户一般在其HOME目录内是…

Leetcode 675 为高尔夫比赛砍树

文章目录 1. 题目描述2. 我的尝试3. 题解1. BFS 1. 题目描述 Leetcode 675 为高尔夫比赛砍树 2. 我的尝试 typedef priority_queue<int, vector<int>, greater<int>> heap;class Solution { public:int m;int n;int bfs(vector<vector<int>>&…

mysql使用命令给指定用户配置表权限

记录使用命令为用户配置表权限&#xff0c;可用于使用Navicat工具配置权限报错场景下使用&#xff1a; 首先进如部署MYSQL的服务器&#xff0c;然后开始按照以下步骤操作 1、登录mysql程序&#xff1a; 命令&#xff1a;mysql -u wl-prod -p 密码&#xff1a;root 2、切换数…

写一个去除数组中重复元素的函数

1.使用ES6的Set数据结构 Set是一种只存储唯一值的数据结构&#xff0c;因此任何重复的元素都会被自动忽略。然后&#xff0c;我们使用扩展运算符…将Set对象转换回数组&#xff0c;并返回这个新的数组。 请注意&#xff0c;这种方法会改变原始数组中元素的顺序&#xff0c;因…

2024中国(京津冀)太阳能光伏推进大会暨展览会

2024年中国(京津冀)太阳能光伏推进大会暨展览会是一个旨在促进太阳能光伏产业发展的重要会议和展览会。该活动将在中国的京津冀地区举行&#xff0c;旨在汇聚全球太阳能光伏领域的专业人士、政府代表、企业家和科研人员&#xff0c;共同探讨太阳能光伏技术的最新进展和未来发展…

数据集成工具 ---- datax 3.0

1、datax: 是一个异构数据源离线同步工具&#xff0c;致力于实现关系型数据库&#xff08;mysql、oracle等&#xff09;hdfs、hive、hbase等各种异构数据源之间的数据同步 2、参考网址文献&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.md 3、Da…

避抗指南:如何寻找OLED透明屏供应商

寻找OLED透明屏供应商&#xff0c;你可以按照以下步骤进行&#xff1a; 明确需求&#xff1a;首先&#xff0c;你需要明确自己的需求&#xff0c;包括所需OLED透明屏的尺寸、分辨率、亮度、色彩饱和度等具体参数&#xff0c;以及预算和采购量。这有助于你更精准地找到符合需求的…

【sgPhotoPlayer】自定义组件:图片预览,支持点击放大、缩小、旋转图片

特性&#xff1a; 支持设置初始索引值支持显示标题、日期、大小、当前图片位置支持无限循环切换轮播支持鼠标滑轮滚动、左右键、上下键、PageUp、PageDown、Home、End操作切换图片支持Esc关闭窗口 sgPhotoPlayer源码 <template><div :class"$options.name"…

革命性创新:聚道云软件连接器如何为企业重塑财务管理流程?

一、客户介绍 某科技股份有限公司是一家专注于高性能存储技术领域的创新型科技公司。自公司成立以来&#xff0c;该公司始终秉持创新发展的理念&#xff0c;致力于为客户提供卓越的存储解决方案&#xff0c;以满足不同行业对数据存储的需求。作为业界的佼佼者&#xff0c;该公…

SpringBoot(依赖管理和自动配置)

文章目录 1.基本介绍1.springboot是什么&#xff1f;2.快速入门1.需求分析2.环境配置1.确认开发环境2.创建一个maven项目3.依赖配置 pom.xml4.文件目录5.MainApp.java &#xff08;启动类&#xff0c;常规配置&#xff09;6.HelloController.java &#xff08;测试Controller&a…

数字证书在网络安全中的重要性与实际应用

数字证书作为一种“电子身份证”&#xff0c;在当今数字化的商业环境中有着广泛的实际应用。它主要用于身份认证、加密通信、电子签名和安全访问控制等方面&#xff0c;为各行各业提供了安全可靠的数字化解决方案。 网络安全领域 在网络通信中&#xff0c;数字证书被广泛应用…

String 底层是如何实现的?

1、典型回答 String 底层是基于数组实现的&#xff0c;并且数组使用了 final 修饰&#xff0c;不同版本中的数组类型也是不同的&#xff1a; JDK9 之前&#xff08;不含JDK9&#xff09; String 类是使用 char[ ]&#xff08;字符数组&#xff09;实现的但 JDK9 之后&#xf…

MySQl基础入门⑧

上一章的内容 练习&#xff01;上一章表的内容&#xff01;&#xff01;&#xff01;熟能生巧 先重新创建一个数据库 命令create database supermarket; 然后查看数据库、再切换到当前数据库。 查看数据库 : show databases; 切换到当前数据库: use supermarket;创建员工…

动态规划:4种遍历方向图解+Python实现

前言 动态规划类题型在遍历过程中&#xff0c;根据状态转移函数的不同&#xff0c;代码实现时遍历的方向也会有所差异。总的来说&#xff0c;一共可以总结为下图四种模式&#xff1a; 红色五角星表示当前要计算的状态值&#xff1b;白底箭头代表哪些状态要提前算出来&#xf…

【C++设计模式】UML图的介绍及其画法

文章目录 前言一、UML图的介绍1.1 UML图是什么1.2 UML图的作用 二、UML图的画法2.1 最简单的UML图2.2 继承的UML图2.3 关联关系2.4 聚合关系2.5 组合关系2.6 依赖关系 总结 前言 在软件开发过程中&#xff0c;设计模式是一种被广泛应用的方法&#xff0c;它为解决特定问题提供…

centos7.6 tinyproxy BasciAuth

1 为什么centos7.6 tinyproxy 设置了BasicAuth 就会在配置文件这一行报错 BasicAuth myuser mypassword # 设置用户名密码,需要 1.10.0 以上版本才有效,否则报错 2 查看您的 Tinyproxy 版本 tinyproxy -v 3 yum只有1.8 只能自己编译 3.1 编译工具和库。 sudo yum install gc…

十二、软考-系统架构设计师笔记-信息系统架构设计理论与实践

1、信息系统架构基本概念及发展 信息系统架构的定义 信息系统架构是该系统的一个(或多个)结构&#xff0c;而结构由软件元素、元素的外部可见属性及它们之间的关系组成。 信息系统架构分类 信息系统架构分为物理结构与逻辑结构两种&#xff1a; 物理结构是指不考虑系统各部分…

【C++】AVL树的插入、旋转

目录 一、AVL树介绍1.1 概念1.2 定义 二、AVL树的实现2.1 插入2.2 旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋 一、AVL树介绍 1.1 概念 AVL树是高度平衡的二叉搜索树&#xff0c;相比普通的二叉搜索树&#xff0c;它防止了变成单支树的情况。因为AVL树每插入…

云服务器2核4G配置,阿里云和腾讯云哪个便宜?性能更好?

租用2核4G服务器费用多少&#xff1f;2核4G云服务器多少钱一年&#xff1f;1个月费用多少&#xff1f;阿里云2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年&#xff1b;腾讯云轻量2核4G服务器5M带宽165元一年、252元15个月、540元三…

Linux命令-基础

Linux命令-基础 目录 Linux命令-基础lscd(change directory)pwd(print work directory)mkdir(make directory)文件操作命令touchcatmorecp&#xff08;copy&#xff09;mv&#xff08;move&#xff09;rm&#xff08;remove&#xff09; 寻找命令whichfind grepwc管道符echotai…