首页 > 后端开发 > Golang > Go 内存分配:何时应该使用 `new()` 与 `&`?

Go 内存分配:何时应该使用 `new()` 与 `&`?

Barbara Streisand
发布: 2024-12-27 15:15:12
原创
354 人浏览过

Go Memory Allocation: When Should I Use `new()` vs. `&`?

超越分配:探索new()和常规分配之间的区别

Go中,内存管理至关重要,通过new()函数分配内存或与号 (&) 引发了有关效率和精度的争论。本文将深入研究这两种分配方法的细微差别,研究它们的相似之处和潜在差异。

new() 与常规分配:仔细观察

乍一看,代码片段你提供的可能看起来无法区分:

v := &Vector{}
登录后复制

v := new(Vector)
登录后复制

但是,仔细检查发现它们有一个共同点:两种情况下的返回值都是指向 Vector 结构体的新实例的指针。从以下代码示例中可以明显看出这一点:

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
登录后复制

如图所示,两种方法都返回指向 Vector 结构体实例的指针。

混乱难题

new() 和常规分配的存在在 Go 社区中引发了混乱。一些人认为同时拥有这两种选择是不必要的,可能会导致误解。这场争论在 Go 邮件列表中很普遍:

[https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs](https://groups.google .com/forum/?fromgroups=#!topic/golang-nuts/GDXFDJgKKSs)

显着差异:例外

虽然普遍的共识是 new() 和常规分配会产生相似的结果,但有一个值得注意的例外。当使用未命名整数类型或其他基本类型时,new() 成为获取指针的唯一选项。以下代码演示了这一点:

p := new(int)
// Error: cannot take the address of the type int
p := &int{0}
登录后复制

在这种情况下,new() 是唯一允许创建指向未命名整数类型的指针的方法。

结论

虽然 new() 和常规分配在返回值方面没有显着差异,但它们的存在可能会引起混乱。然而,在处理指向未命名整数或基本类型的指针时,记住 new() 是至关重要的,可以帮助阐明它们的用法并避免潜在的陷阱。通过了解 Go 中内存管理技术的微妙之处,开发人员可以优化其代码以提高效率和清晰度。

以上是Go 内存分配:何时应该使用 `new()` 与 `&`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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