這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
字串是不可變位元組(byte)序列,預設值是"",而不是nil。
使用 “`” 定義的原始字串(raw strubg),支援跨行。字串支援 !=、==、<、>、+、+= 操作符。允許以索引號訪問位元組數組,但不能擷取元素地址。
使用 for 遍曆字串時,分 byte 和 rune 兩種方式。
轉換
修改字串,需將其轉換為可變類型([]byte 或 []rune),待完成後再轉換回來。這個過程將重新分配記憶體,並複製資料。這個轉換過程有一定的效能損失。要想獲得更好的效能可以使用 “非安全” 的方式進行改善。
func bytesToString(bs []byte) string { return *(*string)(unsafe.Pointer(&bs))}
亦可以用同樣的方式將 string 轉換為 []byte。只不過得到的位元組序列是不可修改的,當嘗試修改時,會得到如下類似錯誤:
unexpected fault address 0x1066146fatal error: fault[signal SIGBUS: bus error code=0x2 addr=0x1066146 pc=0x104bff0]
動態構建字串
用 + 拼接字串時,每次都會重新分配記憶體。在拼接超多字串時,效能將顯得極差。
改進的思路是分配足夠的記憶體空間,減少記憶體配置的次數。常用方法是 strings.Join 函數,其實現如下:
func Join(a []string, sep string) string { if len(a) == 0 { return "" } if len(a) == 1 { return a[0] } n := len(sep) * (len(a) - 1) for i := 0; i < len(a); i++ { n += len(a[i]) } b := make([]byte, n) bp := copy(b, a[0]) for _, s := range a[1:] { bp += copy(b[bp:], sep) bp += copy(b[bp:], s) } return string(b)}
結合前面的內容,可以對 Join 函數稍作修改,減少一次記憶體配置和內容複寫操作。
func Join(a []string, sep string) string { …… return toString(b)}