string rune byte理解
1799 ワード
string rune byte理解
golang文字列タイプは、よく使用される処理文字列のタイプです.ただしlenを判断したり、単一文字を処理したりする場合はruneやbyteで処理する必要があります.
string最下位ストレージ
データ構造
unsafe.Pointer変換タイプを対応するタイプに変換します.1つのポインタは対応するdataデータを指し、1つはデータ長である.
stringタイプは可変タイプであり、stringに対する修正はいずれもstringのインスタンスを新たに生成し、効率を考慮したシーンであればどのように修正するかをよく考えなければならない.
bytes.Buffer
bytes.Bufferはbufferを2倍に増やし、頻繁な申請メモリを効果的に回避します.
string.join
この関数は最終stringのサイズを一度に申請できますが、すべてのstringを事前に準備しておくと、このようなシーンも効率的です.
strings.Builder
同buffer.
rune
先着コード
最初の処理で返されるのは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に対応する値です.
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