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

时间:2018-08-08 20:27:59

标签: pointers go struct

我已经阅读了一些有关“ 为什么要指针,为什么不指针”的堆栈溢出问题,但是我不太了解。

因此,我想根据自己的情况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种情况,我有以下问题

  1. 性能-哪个更好?为什么?
  2. 垃圾收集-哪个更好?为什么?
  3. 有记忆力吗?
  4. 还有其他效果!

上面的示例应使用哪个?为什么?

请仅根据上面的示例给出答案,您会在上面选择哪种方法?为什么?

谢谢

1 个答案:

答案 0 :(得分:-2)

  1. 在性能方面,最好使用指针,因为golang的所有内容都按值传递。因此,无需golang来查找User结构的值然后传递给Discussion结构,它只需将指针传递给它即可。这也适用于将方法附加到结构的工作方式。 func(u * User)Example {}将执行得更快,因为只需要传递指针。但是我认为性能可以忽略不计

  2. 不知道,我只通过抽搐阅读了one post about garbage collection个问题,他们说,golang 1.7解决了所有这些问题。很少有您担心的情况。

  3. 如果您不使用指向User的指针,则对User结构的更新将不会反映在Discussion结构的内部。 See this example here。请注意,即使用户的ID已更新,也不会在“讨论”中反映出来。

  4. /耸肩