结构的字段值在每次迭代时重置
Struct's field's value resets on each iteration
我有一个 Device
结构,其中包含 Name、IP 和 Status字段;我有一个设备列表;我想每 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)
}
我做错了什么?
您可以按照@Marc 的建议将切片类型更改为指针;或者您可以直接通过其索引更新切片:
for i := range devices {
devices[i].Status = true
}
我有一个 Device
结构,其中包含 Name、IP 和 Status字段;我有一个设备列表;我想每 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)
}
我做错了什么?
您可以按照@Marc 的建议将切片类型更改为指针;或者您可以直接通过其索引更新切片:
for i := range devices {
devices[i].Status = true
}