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

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

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

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

new 和 make 的区别

  1. new 函数:

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

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

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

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

  1. make 函数:

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

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

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

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

标签:
  • 热门焦点
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 小米MIX Fold 3下月亮相:今年唯一无短板的全能折叠屏

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都有新的进展,其中荣耀、三星都已陆续发布了最新的折叠屏旗舰,尤其号荣耀Magi
  • 自研Exynos回归!三星Galaxy S24系列将提供Exynos和骁龙双版本

    年初,全新的三星Galaxy S23系列发布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三个版本,全系搭载超频版骁龙8 Gen 2,虽同样采用台积电4nm工艺制
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
  • 英特尔Xe HPG游戏显卡:拥有512EU,单风扇版本

    据10 月 30 日外媒 TheVerge 消息报道,英特尔 Xe HPG Arc Alchemist 的正面实被曝光,不仅拥有 512 EU 版显卡,还拥有 128EU 的单风扇版本。另外,这款显卡 PCB
Top