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

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

bytes.String() 與 bytes.Bytes() 在 Go 中

bytes.String() 與 bytes.Bytes() 在 Go 中

Go
慕容708150 2023-03-21 17:24:04
考慮這樣一個文本文件:Some texthere.---More textanother line.---Third part of text.我想把它分成三部分,用分隔---符分開。零件應存儲在地圖中。現在,具有不同類型的完全相同的程序。當我使用時string,一切正常:KEY: 0Some texthere.KEY: 1More textanother line.KEY: 2Third part of text.https://play.golang.org/p/IcGdoUNcTEe當我使用時[]byte,事情變得一團糟:KEY: 0Third part of teKEY: 1Third part of text.ne.KEY: 2Third part of text.https://play.golang.org/p/jqLhCrqsvOs為什么?計劃 1 ( string):func main() {    parts := parseParts([]byte(input))    for k, v := range parts {        fmt.Printf("KEY: %d\n%s", k, v)    }}func parseParts(input []byte) map[int]string {    parts := map[int]string{}    s := bufio.NewScanner(bytes.NewReader(input))    buf := bytes.Buffer{}    i := 0    for s.Scan() {        if s.Text() == "---" {            parts[i] = buf.String()            buf.Reset()            i++            continue        }        buf.Write(s.Bytes())        buf.WriteString("\n")    }    parts[i] = buf.String()    return parts}計劃 2 ( []byte):func main() {    parts := parseParts([]byte(input))    for k, v := range parts {        fmt.Printf("KEY: %d\n%s", k, v)    }}func parseParts(input []byte) map[int]string {    parts := map[int]string{}    s := bufio.NewScanner(bytes.NewReader(input))    buf := bytes.Buffer{}    i := 0    for s.Scan() {        if s.Text() == "---" {            parts[i] = buf.String()            buf.Reset()            i++            continue        }        buf.Write(s.Bytes())        buf.WriteString("\n")    }    parts[i] = buf.String()    return parts}
查看完整描述

2 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

在字符串版本中,


parts[i] = buf.String()

parts[i]每次都設置為一個新字符串。在[]byte版本中,


parts[i] = buf.Bytes()

每次都設置parts[i]為由相同數組支持的字節切片。后備數組的內容對于所有三個切片都是相同的,但長度與創建時的長度匹配,這就是為什么所有三個切片顯示相同的內容但在不同的地方截斷的原因。


您可以替換字節切片行


parts[i] = buf.Bytes()

像這樣:


bb := buf.Bytes()

b := make([]byte, len(bb))

copy(b, bb)

parts[i] = b

為了獲得與字符串版本匹配的行為。但是字符串版本更容易,也更符合您似乎想要做的事情。


查看完整回答
反對 回復 2023-03-21
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

區別在于bytes.Buffer.String復制內存,而bytes.Buffer.Bytes不會。引用文檔,

該切片僅在下一次緩沖區修改之前有效(即,僅在下一次調用 Read、Write、Reset 或 Truncate 等方法之前)。


查看完整回答
反對 回復 2023-03-21
  • 2 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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