golang

由字符串数组索引地址了解字符串结构体

a := [2]string{"1","2"}
b := [2]int{1,2}
fmt.Printf("a[0]:%p,a[1]:%p\n",&a[0],&a[1])
fmt.Printf("b[0]:%p,b[1]:%p",&b[0],&b[1])


上述输出结果为下面

a[0]:0xc000004480,a[1]:0xc000004490
b[0]:0xc00000a130,b[1]:0xc00000a138

由输出结果可以看出来,int类型的占有为8byte,而我本机64位,所以数组的连续性,可以看出来,第一个索引值的地址到第二个索引值的地址为8byte而对于string却可以看到是16byte,翻过string的实现,如下

type stringStruct struct {
   str unsafe.Pointer
   len int
}

由上面结构体,可以看到string结构体为一个指针与一个int类型的len字段属性合成的,而对于上面字符串数组第一个索引与第二个索引之间的间距为16个字节,便可以解释通,一个8字节的指针与一个int类型加起来正好是16字节

发表评论

邮箱地址不会被公开。

5 × 2 =