1 回答
TA贡献1773条经验 获得超3个赞
这是因为您操作的是副本而不是切片元素本身。
在您的haveUserId()函数中,它for ... range会复制它循环的元素,然后返回该副本的地址。稍后您将修改此副本,该副本与切片中的值无关。因此,如果稍后您检查切片元素中的地址,它仍然会保持不变(nil)。
可能的解决方法:返回切片元素的地址: &h.users[i]
func (h *Hall) haveUserId(id string) (bool, *user) {
for i := range h.users {
if h.users[i].Id == id {
fmt.Println("UID found")
return true, &h.users[i]
}
}
return false, nil
}
为了证明这一点,请参见以下示例:
type Point struct{ x, y int }
ps := []Point{{1, 2}, {3, 4}}
fmt.Println(ps) // Output: [{1 2} {3 4}]
for _, v := range ps {
v.x += 10 // Modifies just the copy
}
fmt.Println(ps) // Output (unchanged): [{1 2} {3 4}]
for i := range ps {
ps[i].x += 10 // Modifies value in slice
}
fmt.Println(ps) // Output (changed): [{11 2} {13 4}]
- 1 回答
- 0 关注
- 132 浏览
添加回答
举报