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

Pointers 嵌套数组结构的指针与无指针之间的混淆,pointers,go,struct,nested,Pointers,Go,Struct,Nested,我读过一些有关堆栈溢出的问题“为什么指针和为什么不指针”,但我不太理解 所以,我想通过下面的例子来理解 我有一个用户列表,我发现很难理解哪种方法更好更快地将用户的数组结构嵌套到另一个结构中 例如- type loc struct { Type string Point []float64 } type User struct { ID string Name string Location loc ... // 30 more fields }

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

所以,我想通过下面的例子来理解

我有一个用户列表,我发现很难理解哪种方法更好更快地将用户的数组结构嵌套到另一个结构中

例如-

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",
        },
    },
}
考虑到这种情况,我不必在为上面的
游戏
创造价值后更改
所有者
玩家
的数据,
玩家
有时会保持为零
,我应该只使用
用户
还是最好使用
*用户

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

  • 性能-哪一个更好&为什么
  • 垃圾收集-哪一个更好&为什么
  • 有记忆效应吗
  • 还有其他效果吗
请帮助我理解上面的例子,你会选择上面的哪种方法,为什么?使用选项B

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

 for i:=range G.Games{
       G.Games[i]....
 }
这样,每次迭代都会创建一个副本

for _,game:=range G.Games{
      game....
 }
这看起来像是过早的优化。
以最简单/可读的方式编写,如果速度不够快,请查看以找到瓶颈

我读到了这一点,我可以理解在上面的用例中使用“指针”是没有意义的。使用案例B是完美的。您所有的问题都没有答案:它们都依赖于指针与非指针之外的其他东西。如果您的所有方法都在*User上,那么您可能希望存储*个用户。对于所有与“性能”相关的问题:测量您的实际用例并做出决定。没有将结构用作指针或引用的方法。在向结构提供值之后,所有内容都直接存储到数据库中。这就是为什么,我提到要基于上述情况进行回答,而不做任何额外的假设!这就是为什么你有这样做的工具。猜测或询问(某某或其他地方)毫无意义:衡量你的具体情况!