嵌套数组结构的指针或无指针之间的混淆

时间:2018-08-19 23:58:22

标签: pointers go struct nested

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

因此,想根据下面的示例来理解

我有一个用户列表,我很难理解哪种方法更好,更快,以便将用户的数组结构嵌套在另一个结构中。

例如-

type loc struct {
    Type string
    Point []float64
}

type User struct {
    ID string
    Name string
    Location loc
    ... // 30 more fields
}

案例A-对嵌套数组结构使用指针

type Games struct {
    ID string
    Owner []*User
    Player []*User
}

// and storing it as

G:= Games{
    ID: "1",
    Owner: []*User{
        &User {
            ID: "2",
            Name: "User A",
        },
    },
}

案例B-我应该使用上方方法还是下方方法

type Games struct {
    ID string
    Owner []User
    Player []User
}

// storing it as

G := Games {
    ID: "1",
    Owner: []User{
        {
            ID: "2",
            Name: "User A",
        },
    },
}

考虑到这种情况,在为上面的Owner创建值后,我不必更改PlayerGames的数据,并且 Player有时可以保持Nil < / strong>,我应该只使用User还是最好使用*User

基于上述2个案例,我有以下困惑

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

请根据以上示例帮助我理解,您在上面选择了哪种方法,为什么?

1 个答案:

答案 0 :(得分:0)

使用选项B

但是如果要避免在迭代期间分配或更改内容,则需要这样做:

 for i:=range G.Games{
       G.Games[i]....
 }

这样,每次迭代都会创建一个副本

for _,game:=range G.Games{
      game....
 }

这看起来像是过早的优化。 以最简单/可读的方式编写,如果不够快,请查看this来查找瓶颈