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

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

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

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

new 和 make 的区别

  1. new 函数:

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

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

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

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

  1. make 函数:

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

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

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

语法:make(T, size),其中 T 是要分配的类型,size 是指定的大小(对于映射和信道是容量)。Eh528资讯网——每日最新资讯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 语言中的内存分配和数据结构初始化。Eh528资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 联想的ThinkBook Plus下一版曝光,键盘旁边塞个平板

    ThinkBook Plus 是联想的一个特殊笔记本类别,它在封面放入了一块墨水屏,也给人留下了较为深刻的印象。据有人爆料,联想的下一款 ThinkBook Plus 可能更特殊,它
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top