Go语言中new()和make()函数:内存分配和初始化的差异
Go语言的new()和make()函数都用于内存分配,但它们在内存初始化方面存在显著区别。本文将深入探讨两者在初始化上的差异,并解答常见疑惑。
Effective Go文档指出new()函数“仅清零内存,不进行初始化”,而make()函数“仅用于创建切片、映射和通道,并返回一个已初始化(而非清零)的类型T值(而非*T)”。 这引发了两个关键问题:
问题一:内存初始化(initialize memory)的含义是什么?
立即学习“go语言免费学习笔记(深入)”;
内存初始化是指为内存赋予有意义的初始值,而不仅仅是清零。不同数据类型初始化方式不同。例如,整数初始化为0,字符串初始化为空字符串””。对于切片、映射和通道等复合类型,初始化更为复杂,需要分配内存空间并设置属性(如切片的长度和容量、映射的键值对等)。
new()函数只将分配的内存清零,即每个字节都设为0。数值类型的值为0,指针类型值为nil。但对于切片、映射和通道等复合类型,这并非有效初始化,因为它们需要更多设置才能正常工作。
问题二:new()清零,make()未清零的说法是否准确?
Effective Go中关于new()和make()函数的描述在“零值”方面存在细微差别。
new(T)返回指向类型T零值的指针。数值类型的零值是0;指针类型的零值是nil;切片、映射和通道的零值也是nil。关键是,new()返回的是一个指针,指向被清零的内存区域。
make()函数则不同,它直接返回已初始化的切片、映射或通道对象(而非指针)。这些对象并非“未被清零”,而是具有各自类型的有效初始值。例如,make([]int, 0, 10)创建一个长度为0、容量为10的整数切片,这是一个完全有效的Go对象,而非nil。
总结:new()返回指向零值的指针,make()返回已初始化的切片、映射或通道对象。虽然new()会清零分配的内存,但这不等同于完整的初始化,尤其对于复合类型而言。make()会根据类型进行完整初始化,确保返回的对象可直接使用。
以上就是Go语言中new()和make()函数:内存分配和初始化的区别是什么?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2539483.html