首页 > 后端开发 > Golang > Go 内存分配:`new()` 和 `&` 有什么区别?

Go 内存分配:`new()` 和 `&` 有什么区别?

Linda Hamilton
发布: 2024-12-16 13:54:13
原创
551 人浏览过

Go Memory Allocation: What's the Difference Between `new()` and `&`?

区分 Go 中的“new()”和“常规”分配

Go 中有两种分配内存的方法:使用“new()”函数或通过与运算符“&”执行“常规”分配。虽然这两种方法看起来很相似,但它们会产生不同的结果。

理解“new()”

“new()”函数分配一个新的未初始化值指定的类型并返回指向该值的指针。当调用“new()”时,使用“malloc”在堆上分配内存。与“常规”分配不同,“new()”将指定类型的内存初始化为零值。

通过“&”了解常规分配

“常规" 分配使用“&”运算符来获取指向现有值的指针。该方法在堆栈上分配内存并将返回的指针设置为分配的内存的地址。 “常规”分配不会初始化内存,而是保留未初始化的值。

实践中的差异

“new()”和“常规”之间的主要区别分配在于分配内存的初始化。 “new()”将内存初始化为零值,确保数据始终是可预测的。相比之下,“常规”分配会使内存未初始化,需要在使用前显式初始化。

使用注意事项

“new()”和“常规”之间的选择分配取决于具体用例。在处理需要可预测初始状态的结构或复杂数据结构时,首选“new()”。对于可以直接初始化的整数或浮点数等简单数据类型,“常规”分配会更有效。

示例

以下示例说明了“new”和“new”之间的区别()”和常规分配:

package main

import "fmt"
import "reflect"

type Vector struct {
    x int
    y int
}

func main() {
    v := &Vector{}
    x := new(Vector)
    fmt.Println(reflect.TypeOf(v))
    fmt.Println(reflect.TypeOf(x))
}
登录后复制

输出:

*main.Vector
*main.Vector
登录后复制

如图所示,“new()”和“&”都返回一个指向 Vector 对象的指针。然而,“new()”已将 Vector 的值初始化为零,而“&”分配则没有。

以上是Go 内存分配:`new()` 和 `&` 有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板