全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Golang如何使用内置make与new函数_Golang make new函数使用实践

new分配零值内存并返回指针,适用于任意类型;make初始化slice、map、channel并返回原类型,仅用于引用类型。示例:new(int)返回*int,初始为0;make(map[string]int)创建可操作的map。关键区别:new返回指针且仅清零,make返回非指针并完成初始化。错误使用如new(map)会导致nil panic。实践中优先用短变量声明替代new,而make在需预设容量时必不可少,正确使用可避免运行时错误。

在Go语言中,makenew 是两个内置的内存分配函数,但它们的用途和行为有显著区别。理解它们的差异并正确使用,对编写高效、安全的Go代码至关重要。

new函数:为类型分配零值内存

new 的作用是为指定类型分配一片内存空间,并将该内存清零(即赋予类型的零值),然后返回指向该内存的指针。

其函数签名如下:

func new(T) *T

它适用于任何类型 T,返回一个指向新分配的、零值的 T 类型变量的指针。

示例:

ptr := new(int)
fmt.Println(*ptr) // 输出 0
*ptr = 42
fmt.Println(*ptr) // 输出 42

这里 new(int) 分配了一个 int 类型的内存空间,初始值为 0,返回 *int 类型的指针。

注意:new 不适用于 map、slice 或 channel,因为这些类型的零值无法直接使用(如 map 的零值是 nil,不能直接赋值)。

make函数:初始化引用类型

make 用于初始化 slice、map 和 channel 这三种引用类型,使其处于可用状态。它不返回指针,而是返回类型本身。

其函数签名:

func make(T, args...)

其中 T 必须是 slice、map 或 channel。

常见用法:

  • slice:make([]int, len, cap) 创建长度为 len、容量为 cap 的切片
  • map:make(map[string]int) 创建可读写的 map
  • channel:make(chan int, 10) 创建带缓冲的 channel

示例:

slice := make([]int, 5, 10)
m := make(map[string]int)
ch := make(chan int, 5)

如果不使用 make 直接声明引用类型,它们的值为 nil,无法直接操作:

var m map[string]int
m["key"] = "value" // panic: assignment to entry in nil map

make 与 new 的关键区别

  • 返回类型不同:new 返回指针(*T),make 返回原类型(T)
  • 适用类型不同:new 可用于任意类型,make 仅用于 slice、map、channel
  • 初始化程度不同:new 只分配并清零,make 会进行类型特定的初始化,使值可用

举例说明:

ptr := new(map[string]int)
fmt.Println(ptr) // 输出指针地址
fmt.Println(*ptr) // 输出 map[string]int(nil)
(*ptr)["test"] = 1 // panic: assignment to entry in nil map

即使用了 new,map 仍是 nil。必须用 make 才能真正初始化:

m := make(map[string]int)
m["test"] = 1 // 正常工作

使用建议与实践

大多数情况下,不需要手动使用 new。Go 支持短变量声明和自动取址,更推荐直接声明变量或使用复合字面量。

比如代替 new(int):

i := 0
ptr := &i

对于结构体,也推荐使用字面量方式:

type Person struct { Name string }
p := &Person{Name: "Alice"}

而 make 在处理 slice、map、channel 时不可或缺,尤其是在需要预设容量或缓冲大小时,合理使用 make 能提升性能。

基本上就这些。掌握 make 和 new 的区别,能避免常见 nil 指针或运行时 panic,写出更稳健的 Go 程序。


# go  # golang  # go语言  # 区别  # String  # 结构体  # int  # 指针  # 引用类型 


相关文章: 网站app免费制作软件,能免费看各大网站视频的手机app?  浅析上传头像示例及其注意事项  建站之星如何实现五合一智能建站与营销推广?  建站之星展会模板:智能建站与自助搭建高效解决方案  定制建站是什么?如何实现个性化需求?  Android使用GridView实现日历的简单功能  临沂网站制作企业,临沂第三中学官方网站?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  如何制作网站标识牌,动态网站如何制作(教程)?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  如何设置并定期更换建站之星安全管理员密码?  建站三合一如何选?哪家性价比更高?  官网网站制作腾讯审核要多久,联想路由器newifi官网  网站企业制作流程,用什么语言做企业网站比较好?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  建站之家VIP精选网站模板与SEO优化教程整合指南  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  简单实现Android文件上传  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何快速登录WAP自助建站平台?  重庆市网站制作公司,重庆招聘网站哪个好?  建站之星备案流程有哪些注意事项?  建站168自助建站系统:快速模板定制与SEO优化指南  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  移民网站制作流程,怎么看加拿大移民官网?  制作农业网站的软件,比较好的农业网站推荐一下?  建站之星备案是否影响网站上线时间?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何快速搭建二级域名独立网站?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  专业网站建设制作报价,网页设计制作要考什么证?  建站之星价格显示格式升级,你的预算足够吗?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何用PHP快速搭建高效网站?分步指南  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  网站设计制作企业有哪些,抖音官网主页怎么设置?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。