Go中,内存管理至关重要,通过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中文网其他相关文章!