当前位置:首页 > 科技  > 软件

三年Golang码农,竟然不知道New和Make有什么区别?

来源: 责编: 时间:2024-09-10 09:42:15 33观看
导读在 Go 语言中,new 和 make 是两个用于内存分配的内置函数,但它们有不同的用途和行为。理解它们之间的区别对于正确地使用 Go 语言的内存管理至关重要。new 和 make 的区别new 函数:用途:new 用于为变量分配内存,并返回指向

在 Go 语言中,new 和 make 是两个用于内存分配的内置函数,但它们有不同的用途和行为。理解它们之间的区别对于正确地使用 Go 语言的内存管理至关重要。cUP28资讯网——每日最新资讯28at.com

new 和 make 的区别

  1. new 函数:

用途:new 用于为变量分配内存,并返回指向该内存的指针。cUP28资讯网——每日最新资讯28at.com

返回值:new 返回的是一个指向类型的指针,且该内存区域会被初始化为零值(例如整数为 0,布尔为 false,指针为 nil)。cUP28资讯网——每日最新资讯28at.com

适用类型:可以用于所有类型,包括基本类型(如 int、float 等)和复合类型(如 struct、数组等)。cUP28资讯网——每日最新资讯28at.com

语法:new(T),其中 T 是要分配的类型。cUP28资讯网——每日最新资讯28at.com

  1. make 函数:

用途:make 用于为特定类型的数据结构分配和初始化内存,这些类型包括切片(slice)、映射(map)和信道(channel)。cUP28资讯网——每日最新资讯28at.com

返回值:make 返回初始化后的值,而不是指针。cUP28资讯网——每日最新资讯28at.com

适用类型:只能用于切片、映射和信道,不能用于其他类型。cUP28资讯网——每日最新资讯28at.com

语法:make(T, size),其中 T 是要分配的类型,size 是指定的大小(对于映射和信道是容量)。cUP28资讯网——每日最新资讯28at.com

代码实例

使用 new

package mainimport "fmt"func main() {    // 使用 new 分配一个 int 类型的指针    ptr := new(int)    fmt.Println(ptr)  // 输出指针地址,例如:0xc000016088    fmt.Println(*ptr) // 输出零值:0    // 将指针指向的值修改为 100    *ptr = 100    fmt.Println(*ptr) // 输出:100    // 使用 new 分配一个 struct 的指针    type Person struct {        Name string        Age  int    }    p := new(Person)    fmt.Println(p)       // 输出:&{ 0},零值初始化    fmt.Println(p.Name)  // 输出:""(空字符串)    fmt.Println(p.Age)   // 输出:0    // 修改结构体中的字段    p.Name = "Alice"    p.Age = 30    fmt.Println(*p) // 输出:{Alice 30}}

使用 make

package mainimport "fmt"func main() {    // 使用 make 分配一个切片    slice := make([]int, 5) // 创建一个长度为 5 的切片,初始值为 0    fmt.Println(slice)      // 输出:[0 0 0 0 0]    slice[0] = 10    fmt.Println(slice)      // 输出:[10 0 0 0 0]    // 使用 make 分配一个映射    myMap := make(map[string]int)    myMap["key1"] = 100    fmt.Println(myMap)      // 输出:map[key1:100]    // 使用 make 分配一个信道    ch := make(chan int, 2) // 创建一个容量为 2 的缓冲信道    ch <- 1    ch <- 2    fmt.Println(<-ch)       // 输出:1    fmt.Println(<-ch)       // 输出:2}

总结

  • new:用于分配内存并返回指针。适用于所有类型。分配的内存会被初始化为类型的零值。
  • make:用于初始化切片、映射和信道,返回的是初始化后的类型,而不是指针。make 不会返回指针,因为它返回的是已经初始化好的数据结构。

正确理解和使用 new 和 make,可以更好地管理 Go 语言中的内存分配和数据结构初始化。cUP28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-112700-0.html三年Golang码农,竟然不知道New和Make有什么区别?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 2025 款汉上市售价 16.58 万~23.58 万元,引领中大型轿车油耗进入 3 时代

下一篇: 我们一起聊聊 JVM 是如何执行Java程序的

标签:
  • 热门焦点
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • Rust中的高吞吐量流处理

    Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 微信语音大揭秘:为什么禁止转发?

    微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
Top
Baidu
map