[英]How can I update the properties of a slice of structs within another struct?
我有一個Jobs
結構,其中包含一個Job
類型的結構。 我想遍歷每個Job
並“執行”它們,更新它們在過程中的狀態。
代碼如下:
package main
import (
"fmt"
"strconv"
)
type Job struct {
id int
status string
}
type Jobs struct {
jobs []Job
}
func main() {
jobs := Jobs{}
job := Job{id: 1, status: "pending"}
jobs.load(job)
job2 := Job{id: 2, status: "pending"}
jobs.load(job2)
fmt.Println(jobs) // jobs should be pending
jobs.execute()
fmt.Println(jobs) // jobs should be executing
}
func (j *Jobs) load(job Job) {
j.jobs = append(j.jobs, job)
}
func (j *Jobs) execute() {
for _, job := range j.jobs {
if err := job.execute(); err != nil {
id := strconv.Itoa(job.id)
fmt.Println("error occurred when executing job #" + id)
}
}
}
func (j *Job) execute() error {
j.status = "executing"
fmt.Println("Executing job")
// return errors.New("error when executing job")
return nil
}
Output 運行時:
{[{1 pending} {2 pending}]}
Executing job
Executing job
{[{1 pending} {2 pending}]}
預期 output:
{[{1 pending} {2 pending}]}
Executing job
Executing job
{[{1 executing} {2 executing}]}
我想我在某處丟失了一個指針,但我就是無法得到它。
當你這樣做時:
for _, job := range j.jobs {
在循環內部, job
是一個局部變量,包含切片中元素的副本。 因此,當您修改它時,它會修改副本,而不是切片內的值。 為了解決這個問題,您需要獲取指向切片元素本身的指針( &j.jobs[i]
),或者使jobs
成為指針切片而不是值切片。 后者對於閱讀它的其他人可能更清楚,因為看到一片指針,他們會期望這些值會被針對它們運行的函數更新。
Go 中還有一個通用習慣用法,即當類型的方法使用指針接收器時,這意味着使用該類型的“正常”方式是使用指針。 在這里,您定義了一個帶有指針接收器的類型,但您使用的是值,這有點不尋常(但肯定不是聞所未聞)。
只需更改作業的存儲方式:
type Jobs struct {
jobs []*Job
}
然后在代碼中到處使用指針:
func (j *Jobs) load(job *Job) {
j.jobs = append(j.jobs, job)
}
jobs := Jobs{}
job := &Job{id: 1, status: "pending"}
jobs.load(job)
job2 := &Job{id: 2, status: "pending"}
jobs.load(job2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.