go中 for循环的坑

打印 上一主题 下一主题

主题 530|帖子 530|积分 1590

go中 for循环的坑

在使用for循环修改结构体切片中的值时,发现并没有修改成功。
  1. type Dog struct {
  2.         name string
  3. }
  4. func (d *Dog) setNewName(name string) {
  5.         d.name = name
  6. }
  7. func main() {
  8.         d := Dog{
  9.                 name: "123",
  10.         }
  11.         d1 := Dog{
  12.                 name: "456",
  13.         }
  14.         d2 := Dog{
  15.                 name: "789",
  16.         }
  17.         dogSlice := make([]Dog, 0)
  18.         dogSlice = append(dogSlice, d, d1, d2)
  19.         for _, dog := range dogSlice {
  20.                 dog.setNewName("123")
  21.         }
  22.         for _, dog := range dogSlice {
  23.                 fmt.Println(dog)
  24.         }
  25. }
复制代码
结果切片中dog的name并没有全部变为123,后来查资料才知道for循环中的dog其实是个变量,指向的并不是真正的dog。
打印其地址对比可以看出压根就不同。
  1. for i, dog := range dogSlice {
  2.                 fmt.Printf("dog地址:%p 切片中dog的真正地址:%p\n", &dog, &(dogSlice[i]))
  3. }
  4. dog地址:0x14000010230 切片中dog的真正地址:0x14000066180
  5. dog地址:0x14000010230 切片中dog的真正地址:0x14000066190
  6. dog地址:0x14000010230 切片中dog的真正地址:0x140000661a0
复制代码
若要修改切片中的dog的name,应该按照以下这么写,或者将dogSlice变为存dog指针的切片,dogSlice := make([]*Dog, 0)
  1. for i, _ := range dogSlice {
  2.                 dogSlice[i].setNewName("123")
  3. }
  4. for _, v := range dogSlice {
  5.                 fmt.Println(v)
  6. }
  7. 打印如下:
  8. {123}
  9. {123}
  10. {123}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表