2010-08-01 87 views
0

我可以使用io.WriteString輕鬆地將字符串寫入連接。使用Go讀取來自連接的utf8編碼數據使用Go

但是,我似乎很容易從讀取一個字符串從一個連接。我可以從連接中讀取的唯一東西是字節,看起來,我必須以某種方式將其轉換爲字符串。

假設字節代表一個utf8編碼的字符串,我將如何將它們轉換爲字符串形式?

(編輯:另外,我怎麼能簡單地讀取來自一個連接字符串)

謝謝!

回答

2

您可以只投字節的片分爲字符串:

var foo []byte 
var bar string = string(foo) 

沒有編碼/解碼參與,因爲字符串只是視爲字節數組。

+0

這並非100%真實,儘管足夠接近。字符串的處理方式與字節數組不同。 – cthom06 2010-08-01 23:11:46

+0

只是好奇,如何檢查到達字符串的末尾(或字符結束)?或者我可以通過char(使用強制轉換)從連接中構建字符串來讀取char? – helios 2010-08-24 07:51:21

4

一個適合您目的的便利工具可以在標準庫中找到:bytes.Buffersee the package docs)。

假設你有一個實現io.Reader的對象(也就是說,它有一個簽名爲Read([]byte) (int, os.Error)的方法)。

一個常見的例子是一個os.File

f, err := os.Open("/etc/passwd", os.O_RDONLY, 0644) 

如果你想讀該文件的內容轉換爲字符串,只需創建一個bytes.Buffer(其零值是一個隨時可以使用的緩衝,所以你不需要調用構造函數):

var b bytes.Buffer 

使用io.Copy該文件的內容複製到緩衝區:

n, err := io.Copy(b, f) 

(使用io.Copy另一種方法是b.ReadFrom(f) - 他們或多或少相同。)

,並調用緩衝區的字符串方法來檢索緩衝區的內容作爲一個字符串:

s := b.String() 

bytes.Buffer將自動增長以存儲文件的內容,因此您不必擔心分配和增長byte切片等。