在 Go 语言编程里,make 和 new 这两个关键字,虽然都和创建相关,但要是用错了,可能会让程序出现各种意想不到的状况。那它们究竟有啥区别呢?咱们一起来揭开谜底。
一、应用类型不同,各司其职
- new:它主要用来给基本类型(如 int、float、bool、指针、interface 等)分配内存。就好比你要给一个单人小房间准备家具,new 负责把房间(内存空间)准备好,并且把房间里的东西(对应类型的零值)都摆放整齐。列如 var p *int = new(int),这里 new (int) 就为 int 类型分配了内存,返回的是指向这个内存地址的指针,而且这个内存里的值是 int 类型的零值 0。
- make:专门服务于 slice、map 和 channel 这三种引用类型。这就像是要建造一个大型公寓(slice、map 或 channel),make 不仅要准备好土地(分配内存),还要搭建好公寓的框架(初始化数据结构)。列如 s := make([]int, 5),这里 make 为 slice 分配了内存,并且初始化了长度为 5,里面的元素都是 int 类型的零值 0。
二、返回值大不同
- new:返回的是指向所分配内存的指针。由于它只是单纯地分配内存,所以返回指针能让你后续通过指针来操作这块内存。就像给你一把房间钥匙,你可以随时进出房间拿放东西。
- make:返回的是类型本身。由于它对 slice、map 和 channel 做了初始化,所以直接返回类型本身,你拿到手就能用,不需要再通过指针来间接操作。列如你拿到建好的公寓,直接就能入住。
三、初始化细节有差异
- new:分配的内存空间填充为对应类型的零值。对于数值类型是 0,布尔类型是 false,字符串类型是空字符串等等。就像小房间里默认摆放的东西都是基础的初始状态。
- make:对于 slice,除了分配内存,还会根据传入的参数初始化长度和容量;对于 map,会创建一个空的 map 结构;对于 channel,会创建一个带有缓冲区(如果指定了缓冲区大小)或无缓冲区的通道。这就好比建造公寓时,根据不同需求,有的公寓一开始就规划好了房间数量和大小(slice),有的公寓直接建成了一个空荡荡的交易市场(map),还有的公寓建成了一个带有特定容量管道的物流站(channel)。
了解了 make 和 new 的区别,在 Go 编程中,你就能更精准地选择合适的工具,让代码更高效、更稳定,编程之路也会更加顺畅。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END





















- 最新
- 最热
只看作者