我很难理解看似非常基本的操作。我想创建两个结构,其中一个结构将保存另一个结构的一部分。这是一个简单的例子来说明问题:
// 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. 创建仅具有名称的用户,然后在 for 循环中附加帖子。提前致谢。
操场上的这段代码 https://play.golang.org/p/SAiofI26x9
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)
}
Demo: https://play.golang.org/p/CLkNQ2oh0O https://play.golang.org/p/CLkNQ2oh0O
查看对于声明在语言规范中here https://golang.org/ref/spec.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)