Go语言new与make区别

Go语言new与make核心区别详解 一、new在Go语言中,new和make都是用于内存分配的内建函数,但二者在用途和实现机制上存在本质区别。一、new。 阅读详情

在 Go 语言中,new 和 make 都是用于创建新的变量的内置函数,但它们的作用是不同的。

区别

在 Go 语言中,new 和 make 的作用是不同的:

  • new 用于创建一个新的变量,并返回变量的指针。
  • make 用于创建一个新的切片、映射或通道,并返回它们的引用。

虽然 new 和 make 的作用不同,但它们都可以用于创建新的变量。下面是一个示例代码,演示了如何使用 new 和 make 创建新的变量:

package main

import "fmt"

func main() {
    // 使用 new 创建一个新的整型变量
    var numPtr *int = new(int)

    // 使用 make 创建一个新的整型切片
    var numSlice []int = make([]int, 3)

    // 打印变量的值和类型
    fmt.Printf("%v %T\n", numPtr, numPtr)   // 输出:0x12345678 *int
    fmt.Printf("%v %T\n", numSlice, numSlice) // 输出:[0 0 0] []int
}

在上面的代码中,我们使用 new 创建一个新的整型变量 numPtr,并使用 make 创建一个新的整型切片 numSlice。我们可以使用 fmt.Printf 函数打印变量的值和类型,发现 numPtr 是一个指针类型,指向一个值为 0 的整型变量,而 numSlice 是一个切片类型,包含三个值为 0 的整型元素。

用法

在 Go 语言中,new 和 make 的用法有以下几点需要注意:

new

new 用于创建一个新的变量,并返回变量的指针。它的语法如下:

func new(Type) *Type

其中 Type 表示要创建的变量的类型。new 函数会返回一个指向该类型变量的指针,该指针指向的变量会被初始化为零值。

下面是一个示例代码,演示了如何使用 new 创建新的变量:

package main

import "fmt"

func main() {
    // 使用 new 创建一个新的整型变量
    var numPtr *int = new(int)

    // 使用 new 创建一个新的结构体变量
    var personPtr *Person = new(Person)

    // 打印变量的值和类型
    fmt.Printf("%v %T\n", numPtr, numPtr)         // 输出:0x12345678 *int
    fmt.Printf("%v %T\n", personPtr, personPtr) // 输出:&{ 0} *main.Person
}

// 定义一个结构体类型
type Person struct {
    Name string
    Age  int
}

在上面的代码中,我们使用 new 分别创建了一个新的整型变量 numPtr 和一个新的结构体变量 personPtr。我们可以使用 fmt.Printf 函数打印变量的值和类型,发现 numPtr 是一个指向一个值为 0 的整型变量的指针,而 personPtr 是一个指向一个空结构体变量的指针。

make

make 用于创建一个新的切片、映射或通道,并返回它们的引用。它的语法如下:

func make(Type, size IntegerType) Type

其中 Type 表示要创建的变量的类型,size 表示类型的长度或容量(仅适用于切片和通道类型)。make 函数会返回一个新的切片、映射或通道的引用,它们会被初始化为零值。

下面是一个示例代码,演示了如何使用 make 创建新的切片、映射和通道:

package main

import "fmt"

func main() {
    // 使用 make 创建一个新的整型切片
    var numSlice []int = make([]int, 3)

    // 使用 make 创建一个新的字符串映射
    var strMap map[string]string = make(map[string]string)

    // 使用 make 创建一个新的整型通道
    var numChan chan int = make(chan int, 3)

    // 打印变量的值和类型
    fmt.Printf("%v %T\n", numSlice, numSlice)   // 输出:[0 0 0] []int
    fmt.Printf("%v %T\n", strMap, strMap)     // 输出:map[] map[string]string
    fmt.Printf("%v %T\n", numChan, numChan) // 输出:0xc00001a0c0 chan int
}

在上面的代码中,我们使用 make 分别创建了一个新的整型切片 numSlice、一个新的字符串映射 strMap 和一个新的整型通道 numChan。我们可以使用 fmt.Printf 函数打印变量的值和类型,发现 numSlice 是一个包含三个值为 0 的整型元素的切片,strMap 是一个空字符串映射,numChan 是一个容量为 3 的整型通道。

注意事项

在 Go 语言中,需要注意以下几点关于 new 和 make 的使用:

  • new 只能用于创建变量的指针类型,不能用于创建其他类型的变量。
  • make 只能用于创建切片、映射和通道类型的变量,不能用于创建其他类型的变量。
  • 使用 new 创建的指针类型变量会被初始化为零值,但不会分配内存空间。
  • 使用 make 创建的切片、映射和通道类型变量会被初始化为零值,并分配相应的内存空间。
  • 切片、映射和通道类型的变量必须使用 make 创建,否则会导致运行时错误。

下面是一个示例代码,演示了 new 和 make 的一些注意事项:

package main

import "fmt"

func main() {
    // 使用 new 创建一个新的整型变量
    var numPtr *int = new(int)

    // 打印指针的值
    fmt.Println(numPtr) // 输出:0x12345678

    // 尝试解引用一个未分配内存的指针,会导致运行时错误
    // *numPtr = 123

    // 使用 make 创建一个新的整型变量,会导致编译错误
    // var num *int = make(int)

    // 使用 make 创建一个新的整型切片
    var numSlice []int = make([]int, 3)

    // 打印切片的长度和容量
    fmt.Printf("%v %T\n", len(numSlice), len(numSlice)) // 输出:3 int
    fmt.Printf("%v %T\n", cap(numSlice), cap(numSlice)) // 输出:3 int
}

在上面的代码中,我们使用 new 创建了一个新的整型变量 numPtr,并尝试解引用它,但会导致运行时错误,因为它并没有分配内存空间。我们还尝试使用 make 创建一个新的整型变量 num,但会导致编译错误,因为 make 只能用于创建切片、映射和通道类型的变量。最后,我们使用 make 创建了一个新的整型切片 numSlice,并使用 len 和 cap 函数打印了它的长度和容量。

总结

本文介绍了 Go 语言中 new 和 make 的区别、用法和注意事项,并提供了相应的示例代码。虽然 new 和 make 都用于创建新的变量

Buck的振铃实验与分析 上上期我们提到了buck电路的开关的振铃波形,本质原因是LC的阻尼振荡。文章偏理论,那BUCK到底是怎么产生尖峰振荡呢? 要想把这个问题搞清楚,也很是不容易,所以文章有点长,请直接点赞转发加收藏。 问题 本期主要分析以下这两个问题: 1、死区时间是什么?这里有个小台阶是什么情况? 2、上下尖峰振荡是如何产生的?跟哪些因素有关? 理想的BUCK的SW波形 我们由浅入深,一步一步来,先看理想的开关SW波形—没有尖峰电压的波形。 为了能更好的看buck电路各个点的电压电流情况. 阅读详情

相关推荐

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置)

本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。

weixin_33670786的博客 560

go的make用法

例如a:=make([]int,5,10),len(a)输出结果为5,cap(a) 输出结果为10 ,slice在make了之后,设置了slice的大小之后。map在使用make的时候,就算指定了len,也是不起作用的,这个len起不到限制的作用。golang分配内存有一个make函数,该函数第一个数类型,第二个参数的分配的空间,第三个。如果在使用append来操作的话,相当于在slice后面添加新的元素,参数时预留分配空间,前两个参数很好理解,但对第三个参数不是很理解,1:slice使用make。

weixin_54046648的博客 9513

常见的十大量化投资策略(附源码)

量化投资策略是利用量化的方法,进行金融市场的分析、判断和交易的策略、算法的总称。著名的量化投资策略有以下10种(注:策略源码模板不能直接用于实盘交易,仅供探讨交流) 01、海龟交易策略 海龟交易策略是一套非常完整的趋势跟随型的自动化交易策略。这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,这基本上可以作为复杂交易策略设计和开发的模板。 海龟交易策略源码:https://www.myquant.cn/docs/python_strategyies/110 0.

小壁虎的春天 2万+

go语言之make

go make

m0_67207146的博客 5116

基于cat12搞定SBM的ROI的统计分析——vertex水平和ROI水平的双样本T检验

前言 一、Atlas皮层图谱介绍 二、SBM分析——主要以皮层四种常用指标中的厚度(thickness)和沟深(depth)为主

Sophia2023的博客 8753

INCA ProF文件解析

本博文从实际应用出发,介绍INCA prof文件的关键信息,通过实例,描述当得到一个刷写需求后,如何在不改变用户之前的使用习惯的前提下,满足原有的INCA刷写应用数据和标定程序的需求。 声明:本文不涉及项目名称,没有商业目的,纯属分享技术,乐享知识。

汽车电子软件领域知识分享 1万+

go 中 new 和 make 的区别

new 和 make 是 Go 语言中用于内存分配的原语。简单来说,new 只分配内存,make 用于初始化 slice、map 和 channel。 new new(T) 函数是一个分配内存的内置函数,为每个类型分配一片内存,并初始化为零值且返回其内存地址。 语法是 func new(Type) *Type 众所周知,一个已经存在的变量可以赋值给它的指针。 var p int var v *int v = &p *v = 11 fmt.Println(*v) 那么如果它还不是一个变量呢?你可以直

码的世界 8416

【原创】汇川H5U PLC控制伺服的方法

6、在线调试-进入伺服调试,可以在本软件上进行调试,可以实现原点回归、正向点动、反向电动、使能(这里使能打开时触摸屏上的使能不能打开,会冲突)、复位、停止(如下图所示)。5、在原点返回设置中一般情况下对原点信号、正限位、负限位、原点返回方向、原点返回方式进行设置,其他设置默认不改(如下图所示)。3、在单位换算设置上只需要修改脉冲数和移动量(根据伺服配套导轨上名牌进行设置),其他设置默认不改(如下图所示)。11、双击后右边出现编辑框 在上半部分定义变量(IN、INOUT、OUT、VAR)(如下图所示)。

Qinmingyue13的博客 6667

Go语言之make

Go语言之make函数

tangsiqi130的博客 1356

RKNN 端侧部署必看:YOLOv11 Pose 姿态估计模型转换与性能优化实战

随着人工智能技术在边缘计算领域的快速发展,姿态估计作为计算机视觉的重要分支,在智能监控、人机交互、体感游戏等场景中展现出巨大的应用潜力。本文深入研究了YOLOv11 Pose模型在Rockchip RKNN平台上的部署方案,从理论基础、模型转换、平台优化到实际部署进行了全面阐述。通过详细的技术分析和实验验证,证明了RKNN平台能够有效提升YOLOv11 Pose的推理性能,在RK3588硬件平台上实现了高达100 FPS的实时姿态检测,为边缘计算场景下的姿态估计应用提供了高效的解决方案。

m0_71589036的博客 183

ZED双目相机环境配置

ZED SDK 安装文件夹中有一个 Python 脚本(get_python_api.py),可以自动检测操作系统、CUDA 和 Python 版本并下载相应的预编译 Python API 包(pyzed)。安装SDK成功后,我们进入ZED SDK文件夹中的tools子文件夹,运行ZED Explorer.exe 以及 ZED Depth Viewer.exe,查看ZED相机是否能正常启用工作。在本例中,我们简单地检索ZED相机的序列号:打开 ZED相机,然后打印其序列号,然后关闭相机。

qq_53545309的博客 2140

[Golang 学习1]Go语言中函数new与make的使用和区别

Go语言中函数new与make的使用和区别 简介 Go语言中有两个生成函数new与make,容易混淆。故总结一下使用和区别。 Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。 问题的引出:变量声明 var i int var s string 变量的声明我们可以通过var关键字,然后就可以在程序中使用。 当我们不指定变量的默认值时,这些变量的默认值是他们的零值,比如:int...

oRewrite的博客 482

Android 车联网——CarAudioService介绍(六)

CarAudioService 是 Android Automotive OS 中的一个重要组件,用于管理车辆中的音频功能。它是 Android Auto 的一部分,负责处理车辆音频的播放、控制和路由。CarAudioService 使用标准的 Android 组件架构,基于 Binder 通信机制,提供了一组 API,用于管理车辆音频。它包括以下主要功能:音频路由管理:CarAudioService 可以让开发者控制音频的路由,即将音频发送到不同的输出设备,例如车辆的扬声器、耳机等。

小旭的专栏 3202

Go语言new和make的区别

new vs make Go有两种分配原语,分别为new和make。他们做的事情不同,并且处理不同的类型,这看上去让人感到困惑,但是规则相当简单。 new new是一个用来分配内存的内置函数(C++中是运算符),但他和大多数其他语言不同,new不会初始化内存(C++中会分配并调用构造函数),而是将内存归0(也就是初始化成0)。即,new(T)给类型T分配了一个存储了0值的内存并且返回它的地址(在C++中相当于先调用malloc分配内存,然后调用memset初始化内存),返回的类型为**T*。用Go的术语来说

ocfbnj的博客 1546

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Go语言中new和make的区别

转载于:https://www.flysnow.org/2017/10/23/go-new-vs-make.html Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量的时候,可能会觉得有点迷惑,其实他们的规则很简单,下面我们就通过一些示例说明他们的区别和使用。 变量的声明 var i int var s string 变量的声明我们可以通过var关...

metheir的博客 743

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Golang】Golang进阶系列教程--Go 语言 new 和 make 关键字的区别

make 只能用来分配及初始化类型为 slice、map 和 chan 的数据。new 可以分配任意类型的数据;new 分配返回的是指针,即类型 *Type。make 返回类型本身,即 Type;new 分配的空间被清零。make 分配空间后,会进行初始化;

DreamSun的博客 956

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

理解GO语言make 和 new 的区别

new 和 make 都可以用来分配空间,初始化类型,但是它们确有不同。 函数原型 new 是内建函数,函数原型为:func new(Type) *Type make 也是内建函数,它的函数原型 比 new 多了一个(长度)参数,返回值也不同:func make(Type, size IntegerType) Type 第一个参数是一个类型,第二个参数是长度 返回值是一个类型 new 函数...

苏南生的优快云博客 1026

Go语言中的new和make的区别

Go语言中new和make都是用来内存分配的原语(allocation primitives)。简单的说,new只分配内存,不初始化内存;make用于slice,map,和channel的初始化make和new都是golang用来分配内存的內建函数,且在堆上分配内存,make 即分配内存,也初始化内存。new只是将内存清零,并没有初始化内存。make返回的还是引用类型本身;而new返回的是指向类型的指针。make只能用来分配及初始化类型为slice,map,channel的数据;

m0_72874409的博客 893

Go语言nil概念,make与new的区别

Go语言nil的概念,make和new的区别

嫣然细雨红尘路 1286

Go语言make和new关键字的区别及实现原理

Go语言中 new 和 make 是两个内置函数,主要用来创建并分配类型的内存。在我们定义变量的时候,可能会觉得有点迷惑,不知道应该使用哪个函数来声明变量,其实他们的规则很简单,new 只分配内存,而 make 只能用于 slice、map 和 channel 的初始化,下面我们就来具体介绍一下。

技术宅拯救世界 1043

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

本文是看了文章之后的心得。 在此感谢。概述Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。

xiaorenwuzyh的专栏 8324

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

转载:http://se77en.cc/2014/04/25/the-difference-between-function-new-and-make-in-golang/ 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 new 的主要特性 首先 new 是内建函数,你可以从 http://gola

余功鹏的专栏 771

Go 语言 new 和 make 关键字的区别

make 只能用来分配及初始化类型为 slice、map 和 chan 的数据。new 可以分配任意类型的数据;new 分配返回的是指针,即类型*Type。make 返回类型本身,即Type;new 分配的空间被清零。make 分配空间后,会进行初始化;以上就是本文的全部内容,如果觉得还不错的话欢迎转发和关注为什么 Go 不支持 []T 转换为 []interface为什么 Go 语言 struct 要使用 tags。

AlwaysBeta 的专栏 456

Go语言中函数new与make的使用和区别

大家都知道Go语言中的函数new与函数make一直是新手比较容易混淆的东西,看着相似,但其实不同,不过解释两者之间的不同也非常容易,下面这篇文章主要给大家介绍了关于Go语言中函数new与make区别的相关资料,需要的朋友可以参考下。 前言 本文主要给大家介绍了Go语言中函数new与make的使用和区别,关于Go语言中new和make是内建的两个函数,主要用来创建分配类型内存。在我们定义生成变量...

Mr.Phoebe的专栏 645

GO语言中make与new的区别

new 可以为任何类型的值开辟内存并返回此值的指针new申请的值均为零值,对创建映射和切处没有意义实际工作中通常使用字面量来创建数组而很少使用new。

lisus2007的专栏 414

17. Go 语言中的 make 和 new 有什么区别?

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com 我的 Github:github.com/iswbm/GolangCodingTime 1. new 函数 在官方文档中,new 函数的描述如下 // The new b

王炳明 905
上一篇: Go 语言 nil 空值
下一篇: Go语言结构体
GeeCode
博客等级 码龄3年 2粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值