Go语言字符串和Slice(VSCode for mac)

1、先做一个简单的字符串数组应用的测试

months := [...]string{1: "January", 2: "Fed", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "Septemper", 10: "October", 11: "November", 12: "December"}
fmt.Printf("len=%d %s\n", len(months), months[8])
summer := months[6:9]
fmt.Printf("summer:%s\n", summer)

定义了一个针对月份对应英文的字符串的数组,输入出长度为13, 因为空了第0个位置, 数组还可以获取某几个的组合, 比如夏天summer可以取到6到9月,输出结果如下:

len=13 August
summer:[June July August]

2、 定义一个包含unicode字符的字符串

var testStr = "test string 测试串"
fmt.Printf("\nT1:len=%d %q\n", len(testStr), testStr)

此时获取到的字符串长度,默认go是用utf8来对unicode编码,utf8占3个节,因此输出结果如下:

T1:len=21 "test string 测试串"

如果想得到真实的字符个数的话,可以使用如下的方式来取得:

var testStr = "test string 测试串"
fmt.Printf("\nT2:len=%d %q\n", utf8.RuneCountInString(testStr), testStr)

这时就可以得到真实的字符个数,输出结果如下:

T2:len=15 "test string 测试串"

3、 定义一个包含unicode字符的slice(可变数组)

var runes []rune //type rune = int32
//将一个unicode字符串的字符逐个添加到runes
for idx, r := range "test string 测试串" {
	runes = append(runes, r)
	fmt.Printf("%2d:cat=%2d addr=%p\t %v\n", idx, cap(runes), runes, runes)
}
fmt.Printf("\nlen=%d %q", len(runes), runes)

上述的测试的代码输出了每一次添加到slice中新的字符后, slice的容量和地址的变化规律,可以发现,它其实与不可变数组相似,每当发现容量不够用的时候,以当前的长度乘以2作为新的容量,创建了一个新数组(地址会变化),并将旧的数据copy到新的地址中,以此来达到可变数组的目的,上述代码输出结果如下:

 0:cat= 2 addr=0xc000092420	 [116]
 1:cat= 2 addr=0xc000092420	 [116 101]
 2:cat= 4 addr=0xc000092450	 [116 101 115]
 3:cat= 4 addr=0xc000092450	 [116 101 115 116]
 4:cat= 8 addr=0xc0000ac1c0	 [116 101 115 116 32]
 5:cat= 8 addr=0xc0000ac1c0	 [116 101 115 116 32 115]
 6:cat= 8 addr=0xc0000ac1c0	 [116 101 115 116 32 115 116]
 7:cat= 8 addr=0xc0000ac1c0	 [116 101 115 116 32 115 116 114]
 8:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105]
 9:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105 110]
10:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105 110 103]
11:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105 110 103 32]
12:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105 110 103 32 27979]
15:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105 110 103 32 27979 35797]
18:cat=16 addr=0xc0000b2080	 [116 101 115 116 32 115 116 114 105 110 103 32 27979 35797 20018]

len=15 ['t' 'e' 's' 't' ' ' 's' 't' 'r' 'i' 'n' 'g' ' ' '测' '试' '串']

你可能感兴趣的:(go)