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

标签 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",
        },
    },
}

考虑到这种情况,在为上面的 GamesPlayer 有时可以保持为 Nil,我应该只使用 User 还是最好使用 *User

基于以上两种情况,我有以下困惑

  • 性能 - 哪个更好,为什么?
  • 垃圾收集 - 哪个更好,为什么?
  • 有内存效应吗?
  • 任何其他影响!

请根据上面的例子帮助我理解,你会选择上面的哪种方法,为什么?

最佳答案

使用选项B

但是如果你想在迭代过程中避免分配或者改变内容,你需要这样做:

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

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

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

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

关于pointers - 嵌套数组结构的指针或无指针之间的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51922735/

相关文章:

c++ - 紧凑的偏移指针,现有的实现?

c - 增加枚举 char[ ] 的指针

去获取父目录

go - 如何从客户端运行非事务管道。go-redis中的Watch函数

c++ - 从动态数组中删除滞后零

pointers - 通过 &str 获取指针

go - golang中如何实现虚函数?

c# - 与结构的接口(interface),通过使用泛型进行引用

c - 用零值初始化结构数组

c 使用结构指针数组写入和读取文件