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

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

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

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

new 和 make 的区别

  1. new 函数:

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

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

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

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

  1. make 函数:

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

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

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

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

标签:
  • 热门焦点
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 华为HarmonyOS 4升级计划公布:首批34款机型今日开启公测

    8月4日消息,今天下午华为正式发布了HarmonyOS 4系统,在更流畅的前提下,还带来了不少新功能,UI设计也有变化,会让手机焕然一新。华为宣布,首批机型将会在
  • 苹果140W USB-C充电器:采用氮化镓技术

    据10 月 30 日 9to5 Mac 消息报道,当苹果推出新的 MacBook Pro 2021 时,该公司还推出了新的 140W USB-C 充电器,附赠在 MacBook Pro 16 英寸机型的盒子里,也支
Top