这是因为您对 副本 进行操作,而不是对slice元素本身进行操作。
在
haveUserId()函数中
for ...range,make循环遍历的元素的副本,然后返回此副本的地址。因此,稍后您将修改此副本,该副本与切片中的值无关。因此,如果稍后您检查slice元素中的地址,则该地址仍将保持不变(
nil)。
可能的解决方法:返回slice元素的地址:
&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}]在Go Playground上尝试一下。



