gpt4 book ai didi

Golang结构初始化

转载 作者:IT老高 更新时间:2023-10-28 13:04:18 26 4
gpt4 key购买 nike

有一个像这样的简单结构:

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 类型值的指针 正如您在评论中所说,在给定值上定义的方法集type 是在指向该类型值的指针上定义的方法集的子集。这意味着如果你有一个方法

func (e Event) GetName() string {
return e.Name
}

那么 e1e2 都可以调用这个方法,但是如果你有另一个方法,说:

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

那么e1不能使用ChangeName方法,而e2可以。

这(e1 不能使用 ChangeName 方法,而 e2 是)并非如此(虽然它可能是在撰写本文时寻求帮助),感谢@DannyChen 提出这个问题,感谢@GilbertNwaiwu 测试并在下面的评论中发布。

(为了解决上面删除的部分:在结构类型上定义的方法集包括为该类型定义的方法和指向该类型的指针。

相反,Go 现在自动取消对方法的参数的引用,因此如果方法接收到指针,Go 会调用指向该结构的指针的方法,如果方法接收到值,Go 会调用值上的方法该结构所指向的。在这一点上,我尝试更新此答案可能会遗漏语义上的重要内容,因此,如果有人想更正此问题或澄清,请随时添加指向更全面答案的评论。下面是来自 go playground 的一点说明这个问题:https://play.golang.org/p/JcD0izXZGz .

在某种程度上,指针和值如何作为函数定义的方法的参数的这种变化影响了下面讨论的某些领域,但我将保留其余部分,除非有人鼓励我更新它,因为它似乎更多或在按值与指针传递的语言的一般语义的上下文中不太正确。)

至于指针和值之间的区别,这个例子是说明性的,因为在 Go 中通常使用指针来允许您改变变量指向的值(但还有更多原因可以使用指针!尽管对于典型用途,这通常是一个可靠的假设)。因此,如果您将 ChangeName 定义为:

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

如果在值接收器上调用此函数将不是很有用,因为值(不是指针)在传递给函数时不会保留对它们所做的更改。这与围绕如何分配和传递变量的语言设计领域有关:What's the difference between passing by reference vs. passing by value?

您可以在 Go Playground 中的此示例中看到这一点:https://play.golang.org/p/j7yxvu3Fe6

关于Golang结构初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39758304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com