忆梦|我擦~字符串转字节切片后,切片的容量竟然千奇百怪
以下文章来源于新世界杂货铺, 作者许文
新世界杂货铺
作为一名Gopher ,我愿称之为Go的干(杂)货铺子!
神奇的现象
切片 ,切片 ,又是切片!
今天遇到的神奇问题和切片有关 ,具体怎么个神奇法 ,我们来看看下面几个现象
现象一a := "abc"bs := []byte(a)fmt.Println(bs, len(bs), cap(bs))// 输出: [97 98 99] 3 8现象二a := "abc"bs := []byte(a)fmt.Println(len(bs), cap(bs))// 输出: 3 32现象三bs := []byte("abc")fmt.Println(len(bs), cap(bs))// 输出: 3 3现象四a := ""bs := []byte(a)fmt.Println(bs, len(bs), cap(bs))// 输出: [] 0 0现象五a := ""bs := []byte(a)fmt.Println(len(bs), cap(bs))// 输出: 0 32分析到这儿我已经满脑子问号了
字符串变量转切片一个小小的字符串转切片 ,内部究竟发生了什么 ,竟然如此的神奇 。 这种时候只好祭出汇编大法 ,看看汇编代码(希望之后有机会能够对go的汇编语法进行简单的介绍)有没有什么关键词能够帮助我们
以下为现象一转换的汇编代码关键部分
"".main STEXT size=495 args=0x0 locals=0xd8 0x0000 00000 (test.go:5) TEXT "".main(SB), ABIInternal, $216-0 0x0000 00000 (test.go:5) MOVQ (TLS), CX 0x0009 00009 (test.go:5) LEAQ -88(SP), AX 0x000e 00014 (test.go:5) CMPQ AX, 16(CX) 0x0012 00018 (test.go:5) JLS 485 0x0018 00024 (test.go:5) SUBQ $216, SP 0x001f 00031 (test.go:5) MOVQ BP, 208(SP) 0x0027 00039 (test.go:5) LEAQ 208(SP), BP 0x002f 00047 (test.go:5) FUNCDATA $0, gclocals·7be4bbacbfdb05fb3044e36c22b41e8b(SB) 0x002f 00047 (test.go:5) FUNCDATA $1, gclocals·648d0b72bb9d7f59fbfdbee57a078eee(SB) 0x002f 00047 (test.go:5) FUNCDATA $2, gclocals·2dfddcc7190380b1ae77e69d81f0a101(SB) 0x002f 00047 (test.go:5) FUNCDATA $3, "".main.stkobj(SB) 0x002f 00047 (test.go:6) PCDATA $0, $1 0x002f 00047 (test.go:6) PCDATA $1, $0 0x002f 00047 (test.go:6) LEAQ go.string."abc"(SB), AX 0x0036 00054 (test.go:6) MOVQ AX, "".a+96(SP) 0x003b 00059 (test.go:6) MOVQ $3, "".a+104(SP) 0x0044 00068 (test.go:7) MOVQ $0, (SP) 0x004c 00076 (test.go:7) PCDATA $0, $0 0x004c 00076 (test.go:7) MOVQ AX, 8(SP) 0x0051 00081 (test.go:7) MOVQ $3, 16(SP) 0x005a 00090 (test.go:7) CALL runtime.stringtoslicebyte(SB) 0x005f 00095 (test.go:7) MOVQ 40(SP), AX 0x0064 00100 (test.go:7) MOVQ 32(SP), CX 0x0069 00105 (test.go:7) PCDATA $0, $2 0x0069 00105 (test.go:7) MOVQ 24(SP), DX 0x006e 00110 (test.go:7) PCDATA $0, $0 0x006e 00110 (test.go:7) PCDATA $1, $1 0x006e 00110 (test.go:7) MOVQ DX, "".bs+112(SP) 0x0073 00115 (test.go:7) MOVQ CX, "".bs+120(SP) 0x0078 00120 (test.go:7) MOVQ AX, "".bs+128(SP)以下为现象二转换的汇编代码关键部分
"".main STEXT size=393 args=0x0 locals=0xe0 0x0000 00000 (test.go:5) TEXT "".main(SB), ABIInternal, $224-0 0x0000 00000 (test.go:5) MOVQ (TLS), CX 0x0009 00009 (test.go:5) LEAQ -96(SP), AX 0x000e 00014 (test.go:5) CMPQ AX, 16(CX) 0x0012 00018 (test.go:5) JLS 383 0x0018 00024 (test.go:5) SUBQ $224, SP 0x001f 00031 (test.go:5) MOVQ BP, 216(SP) 0x0027 00039 (test.go:5) LEAQ 216(SP), BP 0x002f 00047 (test.go:5) FUNCDATA $0, gclocals·0ce64bbc7cfa5ef04d41c861de81a3d7(SB) 0x002f 00047 (test.go:5) FUNCDATA $1, gclocals·00590b99cfcd6d71bbbc6e05cb4f8bf8(SB) 0x002f 00047 (test.go:5) FUNCDATA $2, gclocals·8dcadbff7c52509cfe2d26e4d7d24689(SB) 0x002f 00047 (test.go:5) FUNCDATA $3, "".main.stkobj(SB) 0x002f 00047 (test.go:6) PCDATA $0, $1 0x002f 00047 (test.go:6) PCDATA $1, $0 0x002f 00047 (test.go:6) LEAQ go.string."abc"(SB), AX 0x0036 00054 (test.go:6) MOVQ AX, "".a+120(SP) 0x003b 00059 (test.go:6) MOVQ $3, "".a+128(SP) 0x0047 00071 (test.go:7) PCDATA $0, $2 0x0047 00071 (test.go:7) LEAQ ""..autotmp_5+64(SP), CX 0x004c 00076 (test.go:7) PCDATA $0, $1 0x004c 00076 (test.go:7) MOVQ CX, (SP) 0x0050 00080 (test.go:7) PCDATA $0, $0 0x0050 00080 (test.go:7) MOVQ AX, 8(SP) 0x0055 00085 (test.go:7) MOVQ $3, 16(SP) 0x005e 00094 (test.go:7) CALL runtime.stringtoslicebyte(SB) 0x0063 00099 (test.go:7) MOVQ 40(SP), AX 0x0068 00104 (test.go:7) MOVQ 32(SP), CX 0x006d 00109 (test.go:7) PCDATA $0, $3 0x006d 00109 (test.go:7) MOVQ 24(SP), DX 0x0072 00114 (test.go:7) PCDATA $0, $0 0x0072 00114 (test.go:7) PCDATA $1, $1 0x0072 00114 (test.go:7) MOVQ DX, "".bs+136(SP) 0x007a 00122 (test.go:7) MOVQ CX, "".bs+144(SP) 0x0082 00130 (test.go:7) MOVQ AX, "".bs+152(SP)
推荐阅读
- 忆梦|电视接口都有哪些?各自有哪些作用?智能电视常见接口解析来了
- 忆梦|刘强东:电商没有制造就业,反而造成大量失业?真是这样吗?
- 忆梦|在国外火爆粒子漩涡壁纸来了,满满的科技感,赶紧来试试吧
- 忆梦|从iPhone11 Pro换成华为,憋了一肚心里话,不吐不快
- 忆梦|利用Sharding-JDBC解决数据库读写分离查询延时问题
- 忆梦|智云发布SMOOTH-XS手机云台,光是这颜色就爱了
- 忆梦|麒麟芯片成绝唱?华为手机全线涨价,最高涨 3000 元
- 忆梦|全县累计开通5G基站10个
- 忆梦|SpaceX和亚马逊正争夺参与定制FCC卫星规则的主导权
- 忆梦|称霸5G?做梦!被美国盯上重罚70亿,华为直接躺赢?
