Pointers Golang结构引用其他结构的指针或无指针以及原因

Pointers Golang结构引用其他结构的指针或无指针以及原因,pointers,go,struct,Pointers,Go,Struct,我读过一些与“为什么使用指针和为什么不使用指针”相关的堆栈溢出问题,但我不太理解 所以,我想从golang的角度,根据自己的情况去理解和学习 我有两个结构 type Discussion struct { ID string `json:"id"` Title string `json:"title"` Content string `json:"content"` Owner *User `json:"owner"` } type User

我读过一些与“为什么使用指针和为什么不使用指针”相关的堆栈溢出问题,但我不太理解

所以,我想从
golang
的角度,根据自己的情况去理解和学习

我有两个结构

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,
    }
}
或者,我应该像下面这样使用-

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,
    }
}
基于以上两种情况,我有以下问题

  • 性能-哪一个更好&为什么
  • 垃圾收集-哪一个更好&为什么
  • 有记忆效应吗
  • 还有其他效果吗 在上述示例中应使用哪一个?原因是什么?

    请仅根据上述示例填写答案,您会选择上述哪种方法?为什么? 谢谢

  • 就性能而言,最好使用指针,因为golang的所有内容都是按值传递的。因此,golang不必查找用户结构的值,然后传递给讨论结构,它只传递指向它的指针。这也适用于将方法附加到结构的工作方式。func(u*User)示例{}将执行得更快,因为只需传入指针。但是,我认为性能可以忽略不计

  • 没有线索,我只看过twitch的文章,他们说他们都是通过golang 1.7解决的。很少有情况下你会担心这一点

  • 如果不使用指向用户的指针,则对用户结构的更新不会反映在讨论结构内部。请注意,即使用户的ID已经更新,但讨论中并没有反映出来

  • /耸耸肩


  • 它们做的事情完全不同,只是在一些琐碎的例子中看起来是一样的。因此,你应该选择一个做你想做的,而不是基于性能的。你能详细说明
    他们做完全不同的事情吗
    ,我想了解他们,或者如果你能提供任何参考URL,我可以根据我的上述情况或附近的任何情况了解更多。那将是很大的帮助。感谢任何一个比另一个“更好”,它们是不同的。任何来源或参考来了解更多关于它,为什么它是不同的基于golang的观点。ffAdvise 1在所述形式中是错误的。指针本身并不是更快,它们可能更慢(例如,由于非本地内存访问和缓存未命中)。如果我传递一个结构,而它不在本地内存中,则仍然存在缓存未命中。或者我弄错了吗?如果你有一个只有值类型的结构,就像第二个版本的结构讨论一样,那么其中的所有内容,包括所有者字段,都会在内存中不断地显示出来。这是一个不好的例子,因为字符串是非局部的,但请考虑
    结构a{X,Y int;V结构{W bool,Z float64}
    和切片
    []a
    。读取整个切片只是一次顺序内存访问,即使您读取A.V.Z。如果您将V作为指针,则迭代切片并读取A.V.Z将变得非线性。它不是关于将参数传递给函数。这总是很慢,因为函数。