在Go中初始化结构时使用new vs. {}

时间:2014-02-28 07:20:30

标签: go

所以我知道你可以在GO中以两种不同的方式初始化结构。其中一个是使用new关键字,它返回一个指向内存中结构的指针。或者您可以使用{}来构建结构。我的问题是什么时候适合使用每个? 感谢

3 个答案:

答案 0 :(得分:10)

当已知类型的完整值时,我更喜欢{},而当要逐步填充值时,我更喜欢new()

在前一种情况下,添加新参数可能涉及添加新的字段初始值设定项。在后者中,它应该被添加到组成该值的任何代码中。

请注意,仅当&T{}是结构,数组,切片或地图类型时才允许使用T语法。

答案 1 :(得分:8)

关于@Volker所说的,通常最好使用&A{}作为指针(并且这不一定是零值:如果我有一个包含单个整数的结构,我可以执行&A{1}初始化字段)。除了风格问题外,人们通常更喜欢这种语法的一个重要原因是,与新的不同,它并不总是实际上在堆中分配内存。如果go编译器可以确定指针永远不会在函数之外使用,它只会将结构体分配为局部变量,这比调用new更有效。

答案 2 :(得分:7)

大多数人使用A{}创建零值type A&A{}来创建指向零值type A的指针。仅new才需要使用int,而int{}就像{{1}}一样。