源代码

runtime/string.go

1
2
3
4
type stringStruct struct {
str unsafe.Pointer
len int
}

2行 可以指向任何数据类型的Pointer,指向底层Byte数组

3行 8个字节的长度 - 是底层Bytes数组的长度,使用unicode字符集,3个自己表示1个汉字,英文在前128位,使用utf-8变长编码(把很长的unicode字符,以8个位为单位的字节),英文字符只需要2个字节,其他需要3个字节

Go语言对utf-8编码/解码 runtime/utf8.go

1
2
3
4
s := "面向加薪学习"
fmt.Println(unsafe.Sizeof(s))
s = "面向加薪学习-欢喜"
fmt.Println(unsafe.Sizeof(s))

输出

16
16

1
2
3
4
5
6
7
8
9
10
11
func ShowLen(s string) {
header := (*reflect.StringHeader)(unsafe.Pointer(&s))
fmt.Println(header.Len)
}

func main() {
s := "面向加薪学习"
ShowLen(s)
s = "面向加薪学习-欢喜"
ShowLen(s)
}

输出

18
25

打印底层byte

1
2
3
4
5
6
7
8
9
10
func PrintWords(s string) {
for i := 0; i < len(s); i++ {
fmt.Println(s[i])
}
}

func main() {
s := "面向加薪学习"
PrintWords(s)
}

输出

233
157
162
229
144
145
229
138
160
232
150
170
229
173
166
228
185
160

1
2
3
4
5
6
7
8
9
10
func PrintWords2(s string) {
for _, c := range s {
fmt.Println(c)
}
}

func main() {
s := "面向加薪学习"
PrintWords2(s)
}

输出

38754
21521
21152
34218
23398
20064

1
2
3
4
5
6
7
8
9
10
func PrintWords3(s string) {
for _, c := range s {
fmt.Printf("%c\n", c)
}
}

func main() {
s := "面向加薪学习"
PrintWords3(s)
}

输出






如何学习Go语言微服务,快速步入架构师

从0到Go语言微服务架构师-海报 从0到Go语言微服务架构师
添加微信 公众号更多内容
wechat gzh