高效地使用字串(Golang)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

字串是不可變位元組(byte)序列,預設值是"",而不是nil
使用 “`” 定義的原始字串(raw strubg),支援跨行。字串支援 !=、==、<、>、+、+= 操作符。允許以索引號訪問位元組數組,但不能擷取元素地址。

使用 for 遍曆字串時,分 byterune 兩種方式。

轉換
修改字串,需將其轉換為可變類型([]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)}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.