Go - 附加到结构上的切片不持久

cur*_*eif 5 struct append go slice

我很难理解什么似乎是一个非常基本的操作。我想创建两个结构,其中一个结构将保存另一个结构的切片。这是一个说明问题的简单示例:

// Post structure
type Post struct {
    User string `bson:"user"`
    Body string `bson:"body"`
}

// User structure
type User struct {
    Name  string `bson:"name"`
    Posts []Post `bson:"posts"`
}

func (u *User) appendPost(post Post) []Post {
    u.Posts = append(u.Posts, post)
    return u.Posts
}

func main() {
    p1 := Post{User: "Jane", Body: "First Jane's post"}
    u := User{Name: "Jane"}

    users := []User{}
    users = append(users, u)

    for _, user := range users {
        user.appendPost(p1)
    }

    // [{Jane []}]
    fmt.Println(users)
}
Run Code Online (Sandbox Code Playgroud)

此代码不会产生错误,也不会产生任何影响。如果我用这样的预定义帖子初始化并附加用户:u := User{Name: "Jane", Posts: []Post{p1}}- 一切都按预期工作。但我无法弄清楚为什么相同的操作在两个步骤中不起作用: 1. 创建只有 Name 的用户,然后在 for 循环中附加帖子。提前致谢。

操场上的这段代码

abh*_*ink 5

for使用 with 的循环range创建切片变量的副本。因此,循环user中的上面是切片中对象for的副本。正是这个副本正在更新,也是您看不到对所需值有任何影响的原因。尝试一下:Userusers

for i, _ := range users {
    // users[i] now refers to the actual User object in the slice
    users[i].appendPost(p1)
}
Run Code Online (Sandbox Code Playgroud)

演示: https: //play.golang.org/p/CLkNQ2oh0O

请查看此处语言规范中的For 语句