GO語言————4.6 字串

FLy_鵬程萬里發表於2018-06-29

4.6 字串

字串是 UTF-8 字元的一個序列(當字元為 ASCII 碼時則佔用 1 個位元組,其它字元根據需要佔用 2-4 個位元組)。UTF-8 是被廣泛使用的編碼格式,是文字檔案的標準編碼,其它包括 XML 和 JSON 在內,也都使用該編碼。由於該編碼對佔用位元組長度的不定性,Go 中的字串也可能根據需要佔用 1 至 4 個位元組(示例見第 4.6 節),這與其它語言如 C++、Java 或者 Python 不同(Java 始終使用 2 個位元組)。Go 這樣做的好處是不僅減少了記憶體和硬碟空間佔用,同時也不用像其它語言那樣需要對使用 UTF-8 字符集的文字進行編碼和解碼。

字串是一種值型別,且值不可變,即建立某個文字後你無法再次修改這個文字的內容;更深入地講,字串是位元組的定長陣列。

Go 支援以下 2 種形式的字面值:

  • 解釋字串:

    該類字串使用雙引號括起來,其中的相關的轉義字元將被替換,這些轉義字元包括:

    • \n:換行符
    • \r:回車符
    • \t:tab 鍵
    • \u 或 \U:Unicode 字元
    • \\:反斜槓自身
  • 非解釋字串:

    該類字串使用反引號括起來,支援換行,例如:

      `This is a raw string \n` 中的 `\n\` 會被原樣輸出。

和 C/C++不一樣,Go 中的字串是根據長度限定,而非特殊字元\0

string 型別的零值為長度為零的字串,即空字串 ""

一般的比較運算子(==!=<<=>=>)通過在記憶體中按位元組比較來實現字串的對比。你可以通過函式len() 來獲取字串所佔的位元組長度,例如:len(str)

字串的內容(純位元組)可以通過標準索引法來獲取,在中括號 [] 內寫入索引,索引從 0 開始計數:

  • 字串 str 的第 1 個位元組:str[0]
  • 第 i 個位元組:str[i - 1]
  • 最後 1 個位元組:str[len(str)-1]

需要注意的是,這種轉換方案只對純 ASCII 碼的字串有效。

注意事項 獲取字串中某個位元組的地址的行為是非法的,例如:&str[i]

字串拼接符 +

兩個字串 s1 和 s2 可以通過 s := s1 + s2 拼接在一起。

s2 追加在 s1 尾部並生成一個新的字串 s

你可以通過以下方式來對程式碼中多行的字串進行拼接:

str := "Beginning of the string " +
	"second part of the string"

由於編譯器行尾自動補全分號的緣故,加號 + 必須放在第一行。

拼接的簡寫形式 += 也可以用於字串:

s := "hel" + "lo,"
s += "world!"
fmt.Println(s) //輸出 “hello, world!”

在迴圈中使用加號 + 拼接字串並不是最高效的做法,更好的辦法是使用函式 strings.Join()(第 4.7.10 節),有沒有更好地辦法了?有!使用位元組緩衝(bytes.Buffer)拼接更加給力(第 7.2.6 節)!

在第 7 章,我們會講到通過將字串看作是位元組(byte)的切片(slice)來實現對其標準索引法的操作。會在第 5.4.1 節中講到的 for 迴圈只會根據索引返回字串中的純位元組,而在第 5.4.4 節(以及第 7.6.1 節的示例)將會展示如何使用 for-range 迴圈來實現對 Unicode 字串的迭代操作。在下一節,我們會學習到許多有關字串操作的函式和方法,同時 fmt 包中的fmt.Sprint(x) 也可以格式化生成並返回你所需要的字串(第 4.4.3 節)。

練習 4.6 count_characters.go

建立一個用於統計位元組和字元(rune)的程式,並對字串 asSASA ddd dsjkdsjs dk 進行分析,然後再分析 asSASA ddd dsjkdsjsこん dk,最後解釋兩者不同的原因(提示:使用 unicode/utf8 包)。




相關文章