为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中通过 new(Type) 和 &Type{} 分配内存的区别

Go 中通过 new(Type) 和 &Type{} 分配内存的区别

Go
隔江千里 2022-10-10 17:56:01
考虑以下示例:type House struct{}func main() {    house1 := new(House)    house2 := &House{}    fmt.Printf("%T | %T\n", house1, house2)}输出:*main.House | *main.House两个赋值都会产生一个指向类型的指针House(来自 main 包)。从 go 文档中new:// The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.两种分配的内存分配在技术上是否相同?有最佳实践吗?
查看完整描述

1 回答

?
守着星空守着你

TA贡献1799条经验 获得超8个赞

两种分配的内存分配在技术上是否相同?

我不打算谈论实现细节,因为这些可能会也可能不会改变。

从语言规范的角度来看,是有区别的。

分配new(T)遵循分配规则(我自己在[斜体]中的注释):

内置函数new采用 type T,在运行时为该类型的变量分配存储空间,并返回*T指向该类型的值。变量按照初始值部分中的说明进行初始化。[它的零值]

使用复合文字进行分配,&T{}遵循复合文字寻址的规则:

复合文字为结构、数组、切片和映射构造值,并在每次评估它们时创建一个新值。

获取复合文字的地址会生成一个指针,该指针指向使用该文字的 value 初始化的唯一变量。

所以new(T)和都&T{}分配类型的存储和产量值*T。然而:

  • new(T)接受任何类型,包括预先声明的标识符intbool,如果您只需要使用单线初始化此类变量,这可能会派上用场:

n := new(int) // n is type *int and points to 0
b := new(bool) // b is type *bool and points to false
  • new引用 Effective Go)“不会初始化1那个内存,它只会将它归零”。即内存位置将具有类型的零值。

  • 复合文字只能用于结构、数组、切片和映射

  • 复合文字可以通过显式初始化结构字段或数组/切片/映射项来构造非零值

底线:正如 Effective Go 所指出的(与上述相同的段落):

如果复合文字根本不包含任何字段,它会为该类型创建一个零值。表达式new(T)&T{}是等价的。


[1]:规范和 Effective Go 中“初始化”一词的使用不一致。要点是new你只能产生一个零值,而复合文字允许你构造非零值。显然,规格是事实的来源。


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信