我已经阅读了一些有关“ 为什么要指针,为什么不指针”的堆栈溢出问题,但是我不太了解。
因此,我想根据自己的情况golang
来理解和学习。
我有2个结构
type Discussion struct {
ID string `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
Owner *User `json:"owner"`
}
type User struct {
ID string `json:"id"`
Name string `json:"name"`
}
在上面的Discussion
结构中,我在*User
字段中使用了Owner
。
考虑到这种情况,在为Owner
创建值后,不必像下面那样更改Discussion
的数据,应该只使用User
还是最好使用*User
像下面一样
func main() {
u := User {
ID: "2",
Name: "StackOverflow",
}
d := Discussion{
ID: "1",
Title: "This is my family",
Content: "I love my family",
Owner: &u,
}
}
或者,我应该像下面那样使用-
type Discussion struct {
ID string `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
Owner User `json:"owner"`
}
type User struct {
ID string `json:"id"`
Name string `json:"name"`
}
func main() {
u := User {
ID: "2",
Name: "StackOverflow",
}
d := Discussion{
ID: "1",
Title: "This is my family",
Content: "I love my family",
Owner: u,
}
}
基于上述2种情况,我有以下问题
上面的示例应使用哪个?为什么?
谢谢
答案 0 :(得分:-2)
在性能方面,最好使用指针,因为golang的所有内容都按值传递。因此,无需golang来查找User结构的值然后传递给Discussion结构,它只需将指针传递给它即可。这也适用于将方法附加到结构的工作方式。 func(u * User)Example {}将执行得更快,因为只需要传递指针。但是我认为性能可以忽略不计
不知道,我只通过抽搐阅读了one post about garbage collection个问题,他们说,golang 1.7解决了所有这些问题。很少有您担心的情况。
如果您不使用指向User的指针,则对User结构的更新将不会反映在Discussion结构的内部。 See this example here。请注意,即使用户的ID已更新,也不会在“讨论”中反映出来。
/耸肩