string 本质是个byte数组
rune 是个int32的别名
package main import ( "fmt" "reflect" "unsafe" ) func main() { s := "A你好B" sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) b := (*[8]byte)(unsafe.Pointer(sh.Data)) fmt.Printf("%08b\n", b) bsx := []rune(s) bsxh := (*reflect.SliceHeader)(unsafe.Pointer(&bsx)) y1 := (*[4]rune)(unsafe.Pointer(bsxh.Data)) fmt.Printf("%032b\n", y1) y2 := (*[16]byte)(unsafe.Pointer(bsxh.Data)) fmt.Printf("%08b\n", y2) }
结果
根据utf-8编码规则
分析一下
可以看出string在转rune的时候,是根据utf-8编码转去掉规则标志位后连接组成的二进制数,按int32内存分布规则重新分布