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

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

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

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

new 和 make 的区别

  1. new 函数:

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

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

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

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

  1. make 函数:

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

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

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

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

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
Top