我有一个帐户结构如下:type Account struct { Id string Name string Address string City string Email string Phone string Username string Password string IsActive bool}我也有两个功能:find和update。该find函数从切片中找到某个元素并返回指向该元素的指针:func find(accounts []Account, username string) *Account { for _, acc := range accounts { if acc.IsActive && acc.Username == username { return &acc } } return nil}更新函数从参数更改某些字段:func update(account *Account, name string) { account.Name = name}在main中,我尝试find从切片中提取一个元素并将其存储到帐户指针。然后,我尝试update下一行中的一个字段。这就是我的main样子:func main() { accounts := []Account{{ Id: "1", Name: "name", Address: "address", City: "city", Email: "email@email.com", Phone: "123456789", Username: "username", Password: "1234", IsActive: true, }} var acc *Account acc = find(accounts, "username") fmt.Printf("%v\n", accounts) fmt.Println(acc) update(acc, "updated") fmt.Printf("%v\n", accounts) fmt.Println(acc)}问题是update调用时,切片中的元素没有更新。它只是更新存储帐户的数据。下面是main的输出:// find[{1 name address city email@email.com 123456789 username 1234 true}]&{1 name address city email@email.com 123456789 username 1234 true}// update[{1 name address city email@email.com 123456789 username 1234 true}]&{1 updated address city email@email.com 123456789 username 1234 true}当存储元素发生变化时,如何使切片内的元素更新?感谢您的帮助,任何建议将不胜感激。
1 回答
蓝山帝景
TA贡献1843条经验 获得超7个赞
问题是您返回的是元素的副本,而不是数组中元素的实际地址
return &acc
如下更改您的查找功能
func find(accounts []Account, username string) *Account {
for idx , acc := range accounts {
if acc.IsActive && acc.Username == username {
return &accounts[idx]
}
}
return nil
}
你会得到预期的回应
[{1 name address city email@email.com 123456789 username 1234 true}]
&{1 name address city email@email.com 123456789 username 1234 true}
[{1 updated address city email@email.com 123456789 username 1234 true}]
&{1 updated address city email@email.com 123456789 username 1234 true}
您可以在 go playground中查看更新的代码
- 1 回答
- 0 关注
- 86 浏览
添加回答
举报
0/150
提交
取消