我很难理解什么似乎是一个非常基本的操作。我想创建两个结构,其中一个结构将包含另一个结构的片。这里'举例说明问题:
// 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)
}
此代码不会产生任何错误,也不会产生任何影响。如果我初始化并附加具有预定义帖子的用户:u := User{Name: "Jane", Posts: []Post{p1}}
- 一切都按预期工作。但是我无法弄清楚为什么同样的操作不能分两步完成:
1.创建仅具有Name的用户,稍后在for循环中附加帖子。提前谢谢。
答案 0 :(得分:2)
for
一起使用的 range
循环会创建切片变量的副本。因此,user
循环中的for
上方是User
切片中users
对象的副本。这个副本正在更新,以及您没有看到对期望值有任何影响的原因。试试这个:
for i, _ := range users {
// users[i] now refers to the actual User object in the slice
users[i].appendPost(p1)
}
演示:https://play.golang.org/p/CLkNQ2oh0O
在语言规范here中查看 For Statement 。