golang 中的字符類型

golang 把字符類型單獨分離出來, 而且使用了不一樣的語法:程序員

var char = '這'

而用 fmt.Printf("%T", char) 查看其類型, 居然是 int32 這讓人奇怪, 一般字符組成了字符串, 字符串若是隻有一個字符長度的話, 應當就是字符. 但 golang 的作法改變了這種一般的觀點:golang

字符是數字類型, 若是要合併一個字符到字符串中, 該怎麼辦呢?函數

str := string(char)

golang 預約義了 rune, byte 兩種和字符有關的類型,但在顯示的時候, 卻改了名字:學習

var x byte
fmt.Printf("x is %T", x) // x is int8
var y rune
fmt.Printf("y is %T", y) // y is int32

這彷佛沒有必要定義這兩種類型, 由於 golang 本身的內置函數根本就忽略了它.編碼

另外 golang 和字符串有關的類型也比較混亂, 有 string, []byte, []rune. 和 string 有關的 strings 模塊的輸入數據類型大部分是 []string. 而由此引起的數據流就更加混亂, 讀出的字符串有各類格式.code

不過 golang 提供了內置函數對這些數據類型進行相互轉換:圖片

var str = "這裏輸入代碼"
var chars = []rune(str)
var bytes = []byte(str) // 這裏就亂了, 由於 unicode 字符被 asc 編碼了

我想, golang 搞了這麼多類型來處理字符串是基於效率的考慮:unicode

  1. 字符串是不可變(只讀)類型
  2. []byte, []rune 是切片可變(引用)類型.
  3. []rune 是爲了處理各國語言字符準備的類型
  4. 傳遞大文本時, 用切片將字符串分割成一個一個小部分進行處理
  5. 二進制文件,圖片文件,壓縮文件都是按照 byte 逐個字符處理的.

總之, 學習 golang 的字符串, 就要明白, 傳遞一個大字符串, 最好用引用類型, 而處理一個小字符串, 使用切片就會變得繁瑣.字符串

如何在編碼效率和執行效率之間取得平衡, 就由程序員本身選擇吧.string

相關文章
相關標籤/搜索