【问题标题】:Struct's field's value resets on each iteration [closed]结构的字段值在每次迭代时重置[关闭]
【发布时间】:2021-11-10 22:24:52
【问题描述】:

我有一个带有 NameIPStatus 字段的 Device 结构;我有一个设备列表;我想每 2 秒(或任何其他时间,就此而言)迭代该列表并更改 Status 字段:

type Device struct {
    Name   string
    IP     string
    Status bool
}

// One device is enough to explain the problem
var devices = []Device{
    Device{Name: "phone", IP: "192.168.1.58", Status: false},
}

func main() {
    for range time.Tick(2 * time.Second) {
        for _, j := range devices {
            fmt.Printf("%s: %v\n", j.Name, j.Status)
            j.Status = true
            fmt.Printf("%s: %v\n--------\n", j.Name, j.Status)
        }
    }
}

我希望输出是

phone: false
phone: true
------
phone: true
phone: true
------
phone: true
phone: true
------
...

但我得到了

phone: false
phone: true
--------
phone: false
phone: true
--------
...

基本上,Status 值在每次迭代时都会重置。

如果我将设备移到列表之外,它会按预期工作,如下所示:

var j = Device{Name: "phone", IP: "192.168.1.58", Status: false}

for range time.Tick(2 * time.Second) {
    fmt.Printf("%s: %v\n", j.Name, j.Status)
    j.Status = true
    fmt.Printf("%s: %v\n--------\n", j.Name, j.Status)
}

我做错了什么?

【问题讨论】:

  • for 循环中,j 是每个Device 的副本。将您的切片改为devices = []*Device

标签: list go iteration


【解决方案1】:

您可以按照@Marc 的建议将切片类型更改为指针;或者您可以直接通过其索引更新切片:

for i := range devices {
    devices[i].Status = true
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多