天天看點

Go探索-String

字元

字元梗概

  • ASCII字元集 → (GB2312,BIG5,GBK...) → unicode通用字元集 → utf-8

    ,
    • ascii子符集

      ,一個符号對應一個數字編号,數字編号即可以二進制形式表示這個字元
    • GB2312,BIG5,GBK等編碼

      ,是各個語言以自己國家語言為标準制定的字元編碼規則
    • unicode

      ,unicode 學術學會制作的

      全球統一化的通用字元集

      ,實作了跨語言、跨平台的文本轉換與處理
    • utf-8

      ,是一種變長編碼與解碼規則,ascii 字元集及其他常用字元集編碼與解碼用一個位元組表示,而漢字編碼與解碼由 3 個位元組表示
  • 關系
    • ascii 編碼,表示 128 個英文字元與二進制間的關系,gbk

      編碼是漢字編碼,一個 ascii 字元由 1 個位元組組成,一個漢字由多個字元組成;utf8

    • unicode 規定了不同字元在二進制上的表示形式,但是并沒有規定改如何存儲,有些需要 3 個字元,有些需要 2 個字元,想 a 這種字元,ascii 用一個位元組就能表示,但是在 unicode 中會用 2 個位元組,空間浪費
    • utf-8 解決 unicode 編碼存儲問題,它是一種變長的編碼方式,ascii 碼表裡的字元仍然用一個位元組來存儲,一個漢字用 3 個位元組來存儲
  • 編碼/解碼模闆
    編号 編碼模闆

    [0,127]

    0???????

    [128,2047]

    110????? 10??????

    [2048,65535]

    1110???? 10?????? 10??????

    Go探索-String

string

type StringHeader struct {
	Data uintptr
	Len  int
}
           
  • Data

    存儲的是資料,存儲在隻讀記憶體中的,不能對已經定義的字元串進行修改
  • Len

    表示存儲資料占用的位元組(byte)數,例

    eggo世界

    占用 10 個位元組,前 4 個字母對應一個 unicode 碼點,

    由 utf8 編碼後由 3 個 unicode 表示,界同理
    Go探索-String
  • 示例
package main

import (
	"fmt"
)

/**
值類型:列印位址,直接用取值符(&)列印。
引用類型:列印位址,%p 列印
*/
func main() {
	s1 := "eggo世界"
	fmt.Printf("%c\n", s1[2]) // 字元串底層是隻讀的位元組數組,可以通過索引擷取值
	fmt.Printf("s1: addr=%v,value=%v \n", &s1, s1)
	fmt.Printf("s1: addr=%p\n", &s1)

	bs := ([]byte)(s1) // 重新配置設定記憶體,并拷貝s1的内容到[]byte切片中
	bs[2] = 'o'
	fmt.Printf("%c\n", bs[2])
	// [101 103 111 111 228 184 150 231 149
	// 140],228和184和150共同組成了世,231和149和140 共同組成了界
	fmt.Printf("bs: value=%v \n", bs)
	fmt.Printf("bs: addr=%p \n", bs)
}


           
  • 引用