標準庫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語言 |