簡體   English   中英

如何更新另一個結構中的結構切片的屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM