string rune byte理解

1799 ワード

string rune byte理解
golang文字列タイプは、よく使用される処理文字列のタイプです.ただしlenを判断したり、単一文字を処理したりする場合はruneやbyteで処理する必要があります.
string最下位ストレージ
データ構造
type stringStruct struct {
	array unsafe.Pointer  //      [len]byte    
	length int             //   
}

test := "hello"
	p := (*str)(unsafe.Pointer(&test))
	fmt.Println(&p, p) // 0xc420070018 &{0xa3f71 5}
	c := make([]byte, p.length)
	for i := 0; i < p.length; i++ {
		tmp := uintptr(unsafe.Pointer(p.array))           //         unsafe 
		c[i] = *(*byte)(unsafe.Pointer(tmp + uintptr(i))) //         uintptr
	}
	fmt.Println(c)         // [104 101 108 108 111]
	fmt.Println(string(c)) // [byte] --> string, "hello"


unsafe.Pointer変換タイプを対応するタイプに変換します.1つのポインタは対応するdataデータを指し、1つはデータ長である.
stringタイプは可変タイプであり、stringに対する修正はいずれもstringのインスタンスを新たに生成し、効率を考慮したシーンであればどのように修正するかをよく考えなければならない.
bytes.Buffer
bytes.Bufferはbufferを2倍に増やし、頻繁な申請メモリを効果的に回避します.
string.join
この関数は最終stringのサイズを一度に申請できますが、すべてのstringを事前に準備しておくと、このようなシーンも効率的です.
strings.Builder
同buffer.
rune
先着コード
    var str = "hello   "
	fmt.Println("len(str):", len(str))
	fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))
len(str): 12
RuneCountInString: 8


最初の処理で返されるのはstring内部のlengthであるはずです.統計はbyte配列を格納として使用します.string下層はutf-8.圧縮unicodeを用いた.ストレージには14バイトが必要です.14バイト表現を満たすためにはint 32が必要である.runeはstring int 32の表現です.utf-8のすべての符号化要件を含んでもよい.
stringに対してlenをする時RuneCountInStringはutf-8の規則に従って統計するので、統計の大きさは8.lenの中で、中国語の文字列は3バイトです.6 + 3 + 3 = 12
文字をascii符号化に変換
直接runeタイプに変換し、値を取得することは、対応するasciiに対応する値です.
    value := rune(str[0])
	fmt.Printf("%T %d 
", value, value) //int32 104