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

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

為了將 io.Reader 的內(nèi)容作為字符串指針返回,我可以復(fù)制數(shù)據(jù)的最少次數(shù)是多少?

為了將 io.Reader 的內(nèi)容作為字符串指針返回,我可以復(fù)制數(shù)據(jù)的最少次數(shù)是多少?

Go
SMILET 2022-12-05 16:42:46
一位同事實現(xiàn)了一個函數(shù),該函數(shù)進行 HTTP 調(diào)用并將響應(yīng)主體作為字符串返回。為簡潔起見稍微簡化一下(不,我們并沒有真正忽略所有錯誤):func getStuff(id string) string {    response, _ := http.Get(fmt.Sprintf("/some/url/%s", id))    body, _ := ioutil.ReadAll(response.Body)    return string(body)}響應(yīng)通常相當(dāng)大,所以我想避免不必要的復(fù)制。據(jù)我了解,正如所寫的那樣,我們正在制作響應(yīng)數(shù)據(jù)的三份副本:io.ReadAll將傳入 HTTP 連接中的數(shù)據(jù)復(fù)制到字節(jié)片。string(body)將字節(jié)切片復(fù)制到字符串中。return制作字符串的新副本以供調(diào)用函數(shù)使用。那么,首先,我是否正確理解了當(dāng)前狀態(tài)?簡單的第一步是返回一個指針:response, _ := http.Get(fmt.Sprintf("/some/url/%s", id))body, _ := ioutil.ReadAll(response.Body)result := string(body)return &result這避免了第三個副本。涼爽的。但我仍在制作兩份數(shù)據(jù)副本,我只想制作一份。我可以讓他將返回類型更改為*[]byte,然后我們就可以了return &body。但是所有調(diào)用者都需要自己將結(jié)果轉(zhuǎn)換為字符串,然后我所做的就是將制作第二個副本的邏輯傳播到其他多個地方,而不是將其合并在這里。我可以使用strings.Builder和io.Copy:builder := new(strings.Builder)_, _ := io.Copy(buf, response.Body)result buf.String()return &result這可能會更有效一點(我真的不知道;是嗎?),但我最終還是得到了兩個數(shù)據(jù)副本。是否可以只用一個數(shù)據(jù)副本來做到這一點?我認為不是;只是想知道我是否錯了!
查看完整描述

1 回答

?
月關(guān)寶盒

TA貢獻1772條經(jīng)驗 獲得超5個贊

復(fù)制字符串只復(fù)制字符串頭,其中包含兩個詞:指向包含字符串?dāng)?shù)據(jù)的數(shù)組的指針和長度。它不復(fù)制字符串內(nèi)容。因此,從函數(shù)返回字符串不會復(fù)制該字符串。

如果您將該字符串傳遞給 json 解組之類的東西,您可以[]byte從正文中返回 reader,甚至是 reader,并對其進行處理。如果你需要它作為一個字符串,那么最好有兩個副本:一次從正文中讀取它,然后將它轉(zhuǎn)換成一個字符串。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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