標籤:

標準庫bytes包中,Buffer對象的ReadRune方法如何用...?

寫了段代碼,但是遇到問題了。。。

buffer := bytes.NewBuffer([]byte(「helloworld」))

fmt.Println( buffer.Len() )
for i := 0; i &< buffer.Len(); i++ { v,size,err := buffer.ReadRune()

if err!=nil{
fmt.Println(err.Error())
}
fmt.Printf("v=%v,size=%v
",string(v),size)

}
//預期輸出應該把」helloworld」字元串中的每個字元都輸出到控制台,但是只輸出了hello 求大神搭救,怎麼能通過buffer.ReadRune()讀取helloworld」字元串中的每個字元


因為 buffer.Len,讀多少就減多少,所以讀到一半,buffer.Len 就是 0 了……

另外還有兩個問題:

1、buffer.Len() 不等於 rune 的數量。如果是中文,一個 rune 是需要 3 位元組的(UTF-8 編碼)。例如 "你好,世界",只需要 5 次 ReadRune 就能讀完,但是放進 bytes.Buffer 的話,Len 是 15

2、io.Reader 讀完後,下一次 Read 或者 ReadRune,一般會返回 io.EOF,這是個 error,所以不能用 if err != nil 來判斷錯誤就算了,應該先判斷是不是 io.EOF

這個程序可以這樣寫:

package main

import (
"bytes"
"fmt"
"io"
)

func main() {
buf := bytes.NewBuffer([]byte("Hello, world! 你好,世界"))
for {
r, size, err := buf.ReadRune()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
fmt.Printf("%d %c
", size, r)
}
}

不過,string 類型的 for range,就是按 rune 來遍歷的,下面的程序會有同樣的輸出:

package main

import (
"fmt"
)

func main() {
for _, r := range "Hello, world! 你好,世界" {
fmt.Printf("%d %c
", len(string(r)), r)
}
}


推薦閱讀:

golang 想要持久的火起來,該怎麼做?
Go 1.7.6 和 1.8.2 雙版本發布,GO語言開發團隊為什麼要維護一個較低的歷史版?
go語言網路內容爬蟲如何寫?
如何看待Go進入tiobe top 20?
有哪些可以在500-1000行以內實現的Go語言項目?

TAG:Go語言 |