Go-在结构上附加到切片不会持久化

Go-在结构上附加到切片不会持久化,go,struct,append,slice,Go,Struct,Append,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

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

// 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)
}
此代码不会产生错误,也不会产生任何效果。如果我用预定义的post初始化并附加一个用户,如下所示:
u:=user{Name:“Jane”,Posts:[]post{p1}
-一切都正常工作。但我不明白为什么同样的操作在两个步骤中不起作用: 1.创建只有名称的用户,然后在for循环中追加帖子。提前谢谢


for
范围一起使用的循环创建切片变量的副本。因此,在
for
循环中,上面的
user
users
切片中
user
对象的副本。正是这个副本得到了更新,这也是为什么您看不到对所需值有任何影响的原因。试试rhis:

for i, _ := range users {
    // users[i] now refers to the actual User object in the slice
    users[i].appendPost(p1)
}
演示:

检查语言规范中的语句