亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用指針編輯結構列表變量在go中沒有按預期工作

使用指針編輯結構列表變量在go中沒有按預期工作

Go
牛魔王的故事 2022-01-17 18:20:24
我有一個看起來像的結構type Request struct {    Name string `json:"name"`    Parameters []Parameter `json:"parameters"`}和type Parameter struct {    Attached bool `json:"attached"`    Script string `json:"script"`}現在,我已將 json 解組到結構中,并且 Script 變量有一個 http 位置“ http://localhost/helloworld.sh ”。我想要做的是,用腳本的實際內容更改 struct 變量Parameter.Script,http://localhost/helloworld.sh這是一個普通的 ascii shell 腳本。我為內部結構寫了一個方法,比如func (p *Parameter) SetScript(script string)  {    p.Script = script}使用指向的指針Parameter,并在GetScript函數中,嘗試在獲取響應正文后調用該方法。func GetScript(params *Request)  {  for _, i := range params.Parameters {    switch i.Attached {    case false:        client := new(http.Client)        req, _ := http.NewRequest("GET", i.Script, nil)        resp, _ := client.Do(req)        defer resp.Body.Close()        reader, _ := ioutil.ReadAll(resp.Body)        i.SetScript(string(reader))    }  }}但是,當我在調用此函數后打印結構時,它并沒有修改變量,而是打印http://localhost/helloworld.sh唯一的。我能夠獲得響應正文,這是腳本的實際內容,但我無法從GetScript函數中替換 struct 變量。有人可以指出正確的方法嗎?謝謝你。
查看完整描述

1 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

問題是您正在使用for _, i := range循環,并且您在循環內修改了循環變量:


for _, i := range params.Parameters {

    switch i.Attached {

    case false:

        // ...

        i.SetScript(string(reader))

    }

}

循環變量i是您范圍內的切片元素的副本。因此,如果您對其進行任何修改,您只會修改副本,而不是切片中的元素。(請注意,該SetScript()方法確實有一個指針接收器,但它會接收副本的地址,因此它可以并且只會修改副本。)


一種解決方法是使用 index-only range,并使用索引引用切片元素(將所有出現的地方替換為i)params.Parameters[i]:


for i := range params.Parameters {

    switch params.Parameters[i].Attached {

    case false:

        // ...

        params.Parameters[i].SetScript(string(reader))

    }

}

您可以通過將切片分配給局部變量來簡化上面的代碼(這將只復制切片頭而不是其元素,并且它將引用相同的底層數組),并使用if語句而不是那個丑陋的switch:


p := params.Parameters

for i := range p {

    if !p[i].Attached {

        // ...

        p[i].SetScript(string(reader))

    }

}

另一種簡化/改進是獲取索引表達式的地址,并使用它(因此您可以省略多次重復):


for i := range params.Parameters {

    p := &params.Parameters[i]

    if !p.Attached {

        // ...

        p.SetScript(string(reader))

    }

}


查看完整回答
反對 回復 2022-01-17
  • 1 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號