第一种方法

e1 := Event{Id: 1, Name: "event 1"}
e1Event
e2 := &Event{Id: 1, Name: "event1"}
e2Event
func (e Event) GetName() string {
    return e.Name
}
e1e2
func (e *Event) ChangeName(s string) {
    e.Name = s
}
e1ChangeNamee2
e1ChangeNamee2

(为了解决上面提到的部分:在结构类型上定义的一组方法由为类型定义的方法和指向类型的指针组成。

相反,Go现在会自动将参数解引用到某个方法,以便如果某个方法接收到指针,则Go会使用指向该结构的指针调用该方法,并且如果该方法接收到某个值,则Go会调用该方法该结构。 在这一点上,我尝试更新这个答案可能会遗漏一些重要的语义,所以如果有人想纠正这个问题,或者澄清一下,可以随意添加一条评论,指出更全面的答案。 这里有一点从操场上演示这个问题: https : //play.golang.org/p/JcD0izXZGz 。

在某种程度上,指针和值如何作为函数定义方法的参数发生这种变化会影响下面的话语的某些领域,但是我会让其余的未经编辑,除非有人鼓励我更新它,因为它似乎或多或少是正确的通过值与指针传递的语言的一般语义的上下文。)

ChangeName
func (e Event) ChangeName(s string) {
    e.Name = s
}

如果在值接收器上调用该函数,该函数将不会非常有用,因为如果值传递给函数,则值(而不是指针)不会保留对它们所做的更改。 这与语言设计领域有关变量如何分配和传递的问题有关: 通过引用传递与按值传递有什么区别?

你可以在Go Playground上看到这个例子: https : //play.golang.org/p/j7yxvu3Fe6