第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用指針編輯結(jié)構(gòu)列表變量在go中沒有按預(yù)期工作

使用指針編輯結(jié)構(gòu)列表變量在go中沒有按預(yù)期工作

Go
牛魔王的故事 2022-01-17 18:20:24
我有一個(gè)看起來像的結(jié)構(gòu)type Request struct {    Name string `json:"name"`    Parameters []Parameter `json:"parameters"`}和type Parameter struct {    Attached bool `json:"attached"`    Script string `json:"script"`}現(xiàn)在,我已將 json 解組到結(jié)構(gòu)中,并且 Script 變量有一個(gè) http 位置“ http://localhost/helloworld.sh ”。我想要做的是,用腳本的實(shí)際內(nèi)容更改 struct 變量Parameter.Script,http://localhost/helloworld.sh這是一個(gè)普通的 ascii shell 腳本。我為內(nèi)部結(jié)構(gòu)寫了一個(gè)方法,比如func (p *Parameter) SetScript(script string)  {    p.Script = script}使用指向的指針Parameter,并在GetScript函數(shù)中,嘗試在獲取響應(yīng)正文后調(diào)用該方法。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))    }  }}但是,當(dāng)我在調(diào)用此函數(shù)后打印結(jié)構(gòu)時(shí),它并沒有修改變量,而是打印http://localhost/helloworld.sh唯一的。我能夠獲得響應(yīng)正文,這是腳本的實(shí)際內(nèi)容,但我無法從GetScript函數(shù)中替換 struct 變量。有人可以指出正確的方法嗎?謝謝你。
查看完整描述

1 回答

?
慕妹3242003

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊

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


for _, i := range params.Parameters {

    switch i.Attached {

    case false:

        // ...

        i.SetScript(string(reader))

    }

}

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


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


for i := range params.Parameters {

    switch params.Parameters[i].Attached {

    case false:

        // ...

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

    }

}

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


p := params.Parameters

for i := range p {

    if !p[i].Attached {

        // ...

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

    }

}

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


for i := range params.Parameters {

    p := &params.Parameters[i]

    if !p.Attached {

        // ...

        p.SetScript(string(reader))

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-01-17
  • 1 回答
  • 0 關(guān)注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)