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

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

Barbara Streisand
Barbara Streisand原创
2024-12-27 15:15:12365浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn