有一个简单的结构像这样:
type Event struct {
Id int
Name string
}
这两种初始化方法有什么区别?
e1 := Event{Id: 1, Name: "event 1"}
e2 := &Event{Id: 2, Name: "event 2"}
我为什么要使用这两种初始化方法中的任何一种?
第一种方法
e1 := Event{Id: 1, Name: "event 1"}
正在将变量初始化e1
为类型为的值Event
。
第二
e2 := &Event{Id: 1, Name: "event1"}
正在初始化e2
为指向类型值的指针Event
如您在注释中所述,在给定类型的值上定义的方法集是在指向该类型的值的指针上定义的方法集的子集。这意味着如果您有方法
func (e Event) GetName() string {
return e.Name
}
那么这两个e1
并e2
可以调用此方法,但如果你有其他方法,比如:
func (e *Event) ChangeName(s string) {
e.Name = s
}
然后e1
是无法使用的ChangeName
方法e2
。
这(e1
无法使用ChangeName
方法,同时e2
是)事实并非如此(虽然它可能是在写作的时间,这帮助),这要归功于@DannyChen对于提出这个问题,并@GilbertNwaiwu在测试和发布下面的评论。
(要解决上面的删除部分:结构类型上定义的方法集由为类型定义的方法和指向该类型的指针组成。
相反,Go现在会自动取消引用方法的参数,这样,如果方法接收到一个指针,Go会在指向该结构的指针上调用该方法,如果该方法接收到一个值,Go则会对由指向的值调用该方法该结构。在这一点上,我尝试更新此答案的过程可能缺少语义上的重要内容,因此,如果有人想更正或澄清此问题,请随时添加指向更全面答案的注释。这是去操场上说明此问题的地方:https : //play.golang.org/p/JcD0izXZGz。
在某种程度上,指针和值作为在函数上定义的方法的参数的工作方式的这种变化会影响下面的论述,但是除非有人鼓励我对其进行更新,否则我将不做修改,因为它在内部似乎或多或少是正确的。通过值与指针传递的语言的一般语义的上下文。)
关于指针和值之间的区别,此示例是说明性的,因为Go中通常使用指针来允许您更改变量所指向的值(但还有许多原因也可能会使用指针!使用,这通常是一个可靠的假设)。因此,如果您定义ChangeName
为:
func (e Event) ChangeName(s string) {
e.Name = s
}
如果在值接收器上调用此函数,将不会很有用,因为如果将值(而不是指针)传递给函数,它们将不会保留对其所做的更改。这与围绕如何分配和传递变量的语言设计领域有关:按引用传递与按值传递之间有什么区别?
您可以在Go Playground的以下示例中看到此内容:https : //play.golang.org/p/j7yxvu3Fe6
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句