Go 學習筆記 - String 底層實現原理

1、字符集

2、如何表示混合字符

func main() {

    //string轉化爲unicode編碼切片
    
    str := "hello,world世界"
    
    unicode := []rune(str)
    
    //打印unicode編碼
    
    fmt.Println(unicode)
    
    for _, v := range unicode {
    
          //打印二進制
    
          fmt.Printf("%b\n", v)
    }
}

3、Go 語言 string

func main() {
   //string轉化爲unicode編碼切片
   str := "hello,world世界"
   //打印str的utf-8二進制編碼
   strSlice := []byte(str)
   for _, v := range strSlice {
      fmt.Printf("%b\n", v)
   }
}
/*
1101000   -    h
1100101   -    e
1101100   -    l
1101100   -    l
1101111   -    o
101100    -    ,
1110111   -    w
1101111   -    o
1110010   -    r
1101100   -    l
1100100   -    d
11100100 10111000 10010110   - 世
11100111 10010101 10001100   - 界
*/

type stringStruct struct {
    str unsafe.Pointer    // 底層數組指針
    len int                // 字符串長度,可以通過 len(string) 返回
}
type slice struct {
    array unsafe.Pointer    // 底層數組指針,真正存放數據的地方
    len   int                // 切片長度,通過 len(slice) 返回
    cap   int                // 切片容量,通過 cap(slice) 返回
}
func StringToBytes(str string) []byte {
    var b []byte
    // 切片的底層數組、len字段,指向字符串的底層數組,len字段
    *(*string)(unsafe.Pointer(&b)) = str
    // 切片的 cap 字段賦值爲 len(str)的長度,切片的指針、len 字段各佔八個字節,直接偏移16個字節
    *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&b)) + 2*uintptr(8))) = len(str)
    return b

}
func BytesToString(data []byte) string {
    // 直接轉換
    return *(*string)(unsafe.Pointer(&data))
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Okv0uuJJl4yOy1GxWLScHw