go语言new()和make()函数:内存分配与初始化的细致解读
本文深入探讨Go语言中new()和make()函数在内存分配和初始化方面的差异,解答初学者常遇到的困惑。两者都用于内存分配,但初始化方式不同。
new()和make()函数的根本区别在于它们处理内存初始化的方式。Effective Go文档指出new()仅清零内存,而make()则进行初始化。这引发了两个关键问题:
问题一:内存初始化 (initialize memory) 究竟指什么?
立即学习“go语言免费学习笔记(深入)”;
内存初始化并非简单的“清零”。“清零”仅将内存比特位设置为0。而初始化则根据数据类型赋予特定初始值。例如,整数初始化为0,字符串初始化为空字符串,切片初始化为长度和容量均为0的空切片。
问题二:new()清零,make()不“清零”的说法是否准确?
Effective Go的描述需要仔细理解。new()返回指向新分配内存的指针,该内存被初始化为该类型的零值。基本类型(如int、float)的零值为0;指针类型的零值为nil;结构体的每个字段为其类型的零值。因此,new()确实“清零”,更准确地说,是赋予零值。
make()则不同,它专用于创建切片、映射和通道这三种复合类型。make()返回已初始化的复合类型对象(而非指针),其内部结构已初始化,并非nil。例如,make([]int, 5)创建一个长度和容量均为5的int型切片,所有元素初始化为0。
所以说make()不“清零”并不完全准确。更确切地说,make()并非简单清零,而是根据类型进行初始化,使其可直接使用,无需额外初始化步骤。而new()返回的是指向零值的指针。对于map、slice和channel,它们的零值是nil。
总结:
new()和make()都用于内存分配,但初始化方式不同:new()返回指向零值的指针,make()返回已初始化的复合类型对象。理解此区别对于编写高效、正确的Go代码至关重要。
以上就是Go语言new()和make()函数:零值初始化的差异究竟是什么?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号