英文:
Golang: 3 ways to create a new instance but what's the difference? (Beginner)
问题
我是你的中文翻译助手,以下是翻译好的内容:
我对Golang还不太了解,根据我目前所学,创建结构体有三种不同的方式:
a := MyStruct{} // 普通的按值方式。这种方式叫什么名字?
b := new(MyStruct) // 使用new关键字
c := &MyStruct{} // 使用引用
我不清楚每种方式之间的实际区别,除了发现在使用“普通”方式时,打印对象的内存地址时需要添加引用符号&
,例如 fmt.Printf("%p\n", &a)
,而使用“new”和“引用”方式时则不需要,例如 fmt.Printf("%p\n", b)
。我猜测这是因为使用“普通”方式分配内存的方式不同,但这只是我的猜测。
看起来使用“new”和“引用”方式是等效的选项,选择其中一种是一种风格上的决定?在这种语言中,是否有惯用的偏好方法?还有其他我尚未发现的方式吗?
英文:
I'm new to Golang and from what I've learned so far there are 3 different ways to new up a struct:
a := MyStruct {} // plain by value style. Is that what this is called?
b := new(MyStruct) // using new
c := &MyStruct {} // using a reference
I'm not clear as to the actual differences between each of these other then I've found that I have to add a reference &
symbol when printing the memory address of the object like this fmt.Printf("%p\n", &a)
when using the "plain" style vs fmt.Printf("%p\n", b)
for the "new" and "reference" styles. My assumption is that this is because using the "plain" style allocates memory differently but this is just a guess.
It appears that using the "new" and "reference" styles are equivalent options so choosing between those to is a stylistic decision? Is there an idiomatic preference in this language as to which method I should use? Are there other styles that I've not discovered yet?
答案1
得分: 2
《Go编程语言规范》是一本重要的参考资料,其中包括了复合字面量、分配、变量声明和短变量声明等内容。
在代码示例中,a := MyStruct {}
是一个复合字面量值,b := new(MyStruct)
是一个指向该类型零值的指针,c := &MyStruct {}
是一个指向复合字面量值的指针。a
和 c
是非常常见的用法,而 b
则相对较少见,大多数情况下会使用 c
。
你可以参考《Go之旅》中的示例代码。
英文:
> The Go Programming Language Specification
>
> Composite literals
>
> Allocation
>
> Variable declarations
>
> Short variable declarations
a := MyStruct {}
b := new(MyStruct)
c := &MyStruct {}
a
is a composite literal value. b
is a pointer to a zero value for the type. c
is a pointer to a composite literal value. a
and c
are very common. b
is uncommon, in most cases, c
is used.
Take the Tour of Go for examples.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论