2012-05-31 17 views
35

經常以書面形式提出申請,我發現自己可以選擇使用[]bytestring。除了[]byte明顯的可變性,我該如何決定使用哪一個?何時在Go中使用[]字節或字符串?

我有幾個使用案例的例子:

  1. 函數返回一個新的[]byte。由於切片容量是固定的,有什麼理由不返回字符串?
  2. []byte默認情況下打印效果不如string,所以我經常發現自己正在以string作爲記錄目的。它應該始終是string
  3. 當預先計劃[]byte時,總是會創建一個新的基礎數組。如果前置數據不變,爲什麼這不是string
+1

這聽起來像取決於您的使用。如果你打算和他們一起做string-y操作,那麼把它叫做'string'。如果只是不透明的數據被混洗,爲什麼不''[]字節'?這涉及到用例。 – Ashe

+0

如果您需要處理單個字符而不是UTF-8編碼字節流,則先將其轉換爲符文(32位整數IIRC)。 –

+0

然後還有'[]符文',這是最好的代表一個可變的字符串 – newacct

回答

16

我的建議是在使用文本時默認使用字符串。但如果滿足以下條件之一,則使用[]字節代替:

  • []字節的可變性將顯着減少所需的分配數量。

  • 您正在處理使用[]字節的API,並避免轉換爲字符串將簡化您的代碼。

5
  1. 一個區別是,返回的[]byte可能是潛在 重用以容納另一個/新數據(W/O新的存儲器分配),而 string不能。另一個是,在gc執行至少 ,string是一個比[]byte更小的實體。當有很多這樣的物品存在時,可以使用 來保存一些內存。

  2. 鑄造[]bytestring用於記錄是沒有必要的。典型的'文本'動詞,如%s,%q工作爲string[]byte表達式 同樣。在另一個方向上,對於例如%x% 02x

  3. 取決於爲什麼要進行級聯,並且如果結果是 要再次合併w/something /之後的某處。如果是這種情況,[]byte可能會表現更好。

+0

FWIW,'%v'說明符將[]字節視爲整數數組,這是非'-f'方法的默認值。那麼返回切片的函數怎麼樣,而不是把它們作爲參數? –

+0

你是什麼意思?「字符串是比[]字節小一個字的實體?」? – animaacija

10

我已經得到了,在圍棋,比任何其他非ML風格的語言越多,類型被用來傳達意義和用途的感覺。因此,找出使用哪種類型的最佳方法是問自己數據

一個字符串表示文本。只是文字。編碼不是你必須擔心的,並且所有操作都是逐個字符地工作,而不管字符實際是什麼。

數組表示二進制數據或該數據的特定編碼。 []byte表示數據不是字節流就是單字節字符流。 []int16代表一個整數流或兩個字節的字符流。

鑑於幾乎所有處理字節的事物都具有處理字符串的功能,反之亦然,我建議您不要詢問需要使用什麼數據來處理數據。一旦找出瓶頸,然後優化它們。

編輯:This post是我得到了使用類型轉換打破字符串的基本原理。

相關問題