bool
bool占1位,但是按照8位对齐
字符串, 数组,slice
字符串结构
runtime/string .go
type stringStruct struct {
str unsafe.Pointer
len int
}
type slice struct {
array unsafe.Pointer
len int
cap int
}
数组存储结构和C一样
基于字符串创建的切片和原字符串指向相同的底层字符数组, 字符串的切片操作返回的子串仍然是string,而非slice。
切片数组返回的是,slice,但是底层指向 数组
func disp() {
d := "hello, 世界!"
for i := 0; i < len(d); i++ { // 遍历字节数组
fmt.Println(d[i])
}
for i, v := range d { // 遍历rune数组
fmt.Println(i, v)
}
}
字符串转切片和转[]byte []rune, []byte转字符串
code
func testSlice() {
acb := &[...]byte{1, 2, 3, 4, 5, 11}
acb1 := acb[2:4]
acd := [...]byte{1, 2, 3, 4, 5, 11}
acd1 := acd[2:4]
acd1[0] = 222
abb := &[...]bool{true, true}
as := "sasasa"
as1 := as[1:2]
ab := []byte(as)
ar := []rune(as)
as2 := string(ar)
var cc []int
cc2 := make([]int, 0, 0)
cc3 := []int{}
cc4 := []int{1, 2, 3}
_ = ab
_ = ar
_ = as
_ = as1
_ = as2
_ = acb
_ = acb1
_ = acd1
_ = abb
_ = cc
_ = cc2
_ = cc3
_ = cc4
}
go tool compile -N -l -S function.go > function.s
编译结果, 删除了部分垃圾回收代码
"".testSlice STEXT size=817 args=0x0 locals=0x240
0x0000 00000 (function.go:7) TEXT "".testSlice(SB), ABIInternal, $576-0
0x0000 00000 (function.go:7) MOVQ (TLS), CX
0x0009 00009 (function.go:7) LEAQ -448(SP), AX
0x0011 00017 (function.go:7) CMPQ AX, 16(CX)
0x0015 00021 (function.go:7) JLS 807
0x001b 00027 (function.go:7) SUBQ $576, SP
0x0022 00034 (function.go:7) MOVQ BP, 568(SP)
0x002a 00042 (function.go:7) LEAQ 568(SP), BP
0x0032 00050 (function.go:7) FUNCDATA $0, gclocals·3e27b3aa6b89137cce48b3379a2a6610(SB)
0x0032 00050 (function.go:7) FUNCDATA $1, gclocals·ab5a91be773f238237f644bc41206a37(SB)
0x0032 00050 (function.go:7) FUNCDATA $3, gclocals·0b9f61cbb8d6dc1576beaf315bac6a63(SB)
# autotmp_15+58(SP)变量acb的指向数组
0x0032 00050 (function.go:9) MOVL $0, ""..autotmp_15+58(SP)
0x003a 00058 (function.go:9) MOVW $0, ""..autotmp_15+62(SP)
0x0041 00065 (function.go:9) LEAQ ""..autotmp_15+58(SP), AX
# autotmp_14+320(SP)是autotmp_15+58(SP)的地址,最终会赋给acb, 初始化autotmp_15+58(SP)变量
0x0046 00070 (function.go:9) MOVQ AX, ""..autotmp_14+320(SP)
0x0050 00080 (function.go:9) MOVB $1, ""..autotmp_15+58(SP)
0x0055 00085 (function.go:9) MOVQ ""..autotmp_14+320(SP), AX
0x005f 00095 (function.go:9) MOVB $2, 1(AX)
0x0063 00099 (function.go:9) MOVQ ""..autotmp_14+320(SP), AX
0x006d 00109 (function.go:9) MOVB $3, 2(AX)
0x0071 00113 (function.go:9) MOVQ ""..autotmp_14+320(SP), AX
0x007b 00123 (function.go:9) MOVB $4, 3(AX)
0x007f 00127 (function.go:9) MOVQ ""..autotmp_14+320(SP), AX
0x0089 00137 (function.go:9) MOVB $5, 4(AX)
0x008d 00141 (function.go:9) MOVQ ""..autotmp_14+320(SP), AX
0x0097 00151 (function.go:9) MOVB $11, 5(AX)
0x009b 00155 (function.go:9) MOVQ ""..autotmp_14+320(SP), AX
0x00a3 00163 (function.go:9) MOVQ AX, "".acb+280(SP)
# 赋值acb1的数组slice
0x00b1 00177 (function.go:10) ADDQ $2, AX
0x00b5 00181 (function.go:10) MOVQ AX, "".acb1+520(SP)
0x00bd 00189 (function.go:10) MOVQ $2, "".acb1+528(SP)
0x00c9 00201 (function.go:10) MOVQ $4, "".acb1+536(SP)
# 直接赋值acd
0x00d5 00213 (function.go:12) MOVL "".statictmp_0(SB), AX
0x00db 00219 (function.go:12) MOVWLZX "".statictmp_0+4(SB), CX
0x00e2 00226 (function.go:12) MOVL AX, "".acd+52(SP)
0x00e6 00230 (function.go:12) MOVW CX, "".acd+56(SP)
# 赋值acd1
0x00eb 00235 (function.go:13) LEAQ "".acd+52(SP), AX
0x00f6 00246 (function.go:13) LEAQ "".acd+54(SP), AX
0x00fb 00251 (function.go:13) MOVQ AX, "".acd1+496(SP)
0x0103 00259 (function.go:13) MOVQ $2, "".acd1+504(SP)
0x010f 00271 (function.go:13) MOVQ $4, "".acd1+512(SP)
# 赋值acd1[1] = 222, 即acd[3] = 222
0x011d 00285 (function.go:14) MOVB $-34, "".acd+55(SP)
# 赋值abb
0x0122 00290 (function.go:16) MOVW $0, ""..autotmp_17+50(SP)
0x0129 00297 (function.go:16) LEAQ ""..autotmp_17+50(SP), AX
0x012e 00302 (function.go:16) MOVQ AX, ""..autotmp_16+312(SP)
0x0138 00312 (function.go:16) MOVB $1, ""..autotmp_17+50(SP)
0x013d 00317 (function.go:16) MOVQ ""..autotmp_16+312(SP), AX
0x0147 00327 (function.go:16) MOVB $1, 1(AX)
0x014b 00331 (function.go:16) MOVQ ""..autotmp_16+312(SP), AX
0x0153 00339 (function.go:16) MOVQ AX, "".abb+288(SP)
# 赋值as(string)的结构体stringStruct
0x015b 00347 (function.go:18) LEAQ go.string."sasasa"(SB), AX
0x0162 00354 (function.go:18) MOVQ AX, "".as+360(SP)
0x016a 00362 (function.go:18) MOVQ $6, "".as+368(SP)
# 赋值as1(string)的结构体stringStruct
0x017a 00378 (function.go:19) LEAQ go.string."sasasa"+1(SB), AX
0x0181 00385 (function.go:19) MOVQ AX, "".as1+344(SP)
0x0189 00393 (function.go:19) MOVQ $1, "".as1+352(SP)
# runtime.stringtoslicebyte 的第一个参数autotmp_18+120(SP) 类型是*runtime.tmpBuf, 第二个参数是as
0x0195 00405 (function.go:20) LEAQ ""..autotmp_18+120(SP), AX
0x019a 00410 (function.go:20) MOVQ AX, (SP)
0x019e 00414 (function.go:20) MOVQ "".as+368(SP), AX
0x01a6 00422 (function.go:20) MOVQ "".as+360(SP), CX
0x01ae 00430 (function.go:20) MOVQ CX, 8(SP)
0x01b3 00435 (function.go:20) MOVQ AX, 16(SP)
0x01b8 00440 (function.go:20) CALL runtime.stringtoslicebyte(SB)
# 返回值赋给ab
0x01bd 00445 (function.go:20) MOVQ 40(SP), AX
0x01c2 00450 (function.go:20) MOVQ 32(SP), CX
0x01c7 00455 (function.go:20) MOVQ 24(SP), DX
0x01cc 00460 (function.go:20) MOVQ DX, "".ab+544(SP)
0x01d4 00468 (function.go:20) MOVQ CX, "".ab+552(SP)
0x01dc 00476 (function.go:20) MOVQ AX, "".ab+560(SP)
# runtime.stringtoslicerune 的第一个参数autotmp_19+152(SP) 类型是*runtime.tmpBuf, 第二个参数是as
0x01e4 00484 (function.go:21) LEAQ ""..autotmp_19+152(SP), AX
0x01ec 00492 (function.go:21) MOVQ AX, (SP)
0x01f0 00496 (function.go:21) MOVQ "".as+368(SP), AX
0x01f8 00504 (function.go:21) MOVQ "".as+360(SP), CX
0x0200 00512 (function.go:21) MOVQ CX, 8(SP)
0x0205 00517 (function.go:21) MOVQ AX, 16(SP)
0x020a 00522 (function.go:21) CALL runtime.stringtoslicerune(SB)
# 返回值赋给ar
0x020f 00527 (function.go:21) MOVQ 32(SP), AX
0x0214 00532 (function.go:21) MOVQ 40(SP), CX
0x0219 00537 (function.go:21) MOVQ 24(SP), DX
0x021e 00542 (function.go:21) MOVQ DX, "".ar+472(SP)
0x0226 00550 (function.go:21) MOVQ AX, "".ar+480(SP)
0x022e 00558 (function.go:21) MOVQ CX, "".ar+488(SP)
# runtime.stringtoslicerune 的第一个参数autotmp_20+88(SP) 类型是*runtime.tmpBuf, 第二个参数是ar
0x0236 00566 (function.go:23) LEAQ ""..autotmp_20+88(SP), BX
0x023b 00571 (function.go:23) MOVQ BX, (SP)
0x023f 00575 (function.go:23) MOVQ DX, 8(SP)
0x0244 00580 (function.go:23) MOVQ AX, 16(SP)
0x0249 00585 (function.go:23) MOVQ CX, 24(SP)
0x024e 00590 (function.go:23) CALL runtime.slicerunetostring(SB)
# 返回值赋给as2
0x0253 00595 (function.go:23) MOVQ 40(SP), AX
0x0258 00600 (function.go:23) MOVQ 32(SP), CX
0x025d 00605 (function.go:23) MOVQ CX, "".as2+328(SP)
0x0265 00613 (function.go:23) MOVQ AX, "".as2+336(SP)
# 赋值给cc, 指针指向0, len和cap也都是0
0x026d 00621 (function.go:25) MOVQ $0, "".cc+448(SP)
0x0279 00633 (function.go:25) XORPS X0, X0
0x027c 00636 (function.go:25) MOVUPS X0, "".cc+456(SP)
# 赋值给cc2, 指针指向autotmp_21+48(SP), len和cap也都是0
0x0284 00644 (function.go:26) LEAQ ""..autotmp_21+48(SP), AX
0x028d 00653 (function.go:26) MOVQ AX, "".cc2+424(SP)
0x0295 00661 (function.go:26) XORPS X0, X0
0x0298 00664 (function.go:26) MOVUPS X0, "".cc2+432(SP)
# 赋值给cc3, 指针指向autotmp_21+48(SP), len和cap也都是0
0x02a0 00672 (function.go:27) LEAQ ""..autotmp_24+48(SP), AX
0x02a5 00677 (function.go:27) MOVQ AX, ""..autotmp_22+304(SP)
0x02b1 00689 (function.go:27) MOVQ AX, "".cc3+400(SP)
0x02b9 00697 (function.go:27) XORPS X0, X0
0x02bc 00700 (function.go:27) MOVUPS X0, "".cc3+408(SP)
# 赋值给cc4
0x02c4 00708 (function.go:28) LEAQ ""..autotmp_26+64(SP), AX
0x02c9 00713 (function.go:28) MOVQ AX, ""..autotmp_25+296(SP)
0x02d3 00723 (function.go:28) MOVQ "".statictmp_1(SB), AX
0x02da 00730 (function.go:28) MOVQ AX, ""..autotmp_26+64(SP)
0x02df 00735 (function.go:28) MOVUPS "".statictmp_1+8(SB), X0
0x02e6 00742 (function.go:28) MOVUPS X0, ""..autotmp_26+72(SP)
0x02eb 00747 (function.go:28) MOVQ ""..autotmp_25+296(SP), AX
0x02f7 00759 (function.go:28) MOVQ AX, "".cc4+376(SP)
0x02ff 00767 (function.go:28) MOVQ $3, "".cc4+384(SP)
0x030b 00779 (function.go:28) MOVQ $3, "".cc4+392(SP)
# 返回
0x0317 00791 (function.go:44) MOVQ 568(SP), BP
0x031f 00799 (function.go:44) ADDQ $576, SP
0x0326 00806 (function.go:44) RET
0x0327 00807 (function.go:44) NOP
0x0327 00807 (function.go:7) CALL runtime.morestack_noctxt(SB)
0x032c 00812 (function.go:7) JMP 0
0x0000 65 48 8b 0c 25 00 00 00 00 48 8d 84 24 40 fe ff eH..%....H..$@..
0x0010 ff 48 3b 41 10 0f 86 0c 03 00 00 48 81 ec 40 02 .H;A.......H..@.
0x0020 00 00 48 89 ac 24 38 02 00 00 48 8d ac 24 38 02 ..H..$8...H..$8.
0x0030 00 00 c7 44 24 3a 00 00 00 00 66 c7 44 24 3e 00 ...D$:....f.D$>.
0x0040 00 48 8d 44 24 3a 48 89 84 24 40 01 00 00 84 00 .H.D$:H..$@.....
0x0050 c6 44 24 3a 01 48 8b 84 24 40 01 00 00 84 00 c6 .D$:.H..$@......
0x0060 40 01 02 48 8b 84 24 40 01 00 00 84 00 c6 40 02 @..H..$@......@.
0x0070 03 48 8b 84 24 40 01 00 00 84 00 c6 40 03 04 48 .H..$@......@..H
0x0080 8b 84 24 40 01 00 00 84 00 c6 40 04 05 48 8b 84 ..$@......@..H..
0x0090 24 40 01 00 00 84 00 c6 40 05 0b 48 8b 84 24 40 $@......@..H..$@
0x00a0 01 00 00 48 89 84 24 18 01 00 00 84 00 eb 00 eb ...H..$.........
0x00b0 00 48 83 c0 02 48 89 84 24 08 02 00 00 48 c7 84 .H...H..$....H..
0x00c0 24 10 02 00 00 02 00 00 00 48 c7 84 24 18 02 00 $........H..$...
0x00d0 00 04 00 00 00 8b 05 00 00 00 00 0f b7 0d 00 00 ................
0x00e0 00 00 89 44 24 34 66 89 4c 24 38 48 8d 44 24 34 ...D$4f.L$8H.D$4
0x00f0 84 00 eb 00 eb 00 48 8d 44 24 36 48 89 84 24 f0 ......H.D$6H..$.
0x0100 01 00 00 48 c7 84 24 f8 01 00 00 02 00 00 00 48 ...H..$........H
0x0110 c7 84 24 00 02 00 00 04 00 00 00 eb 00 c6 44 24 ..$...........D$
0x0120 37 de 66 c7 44 24 32 00 00 48 8d 44 24 32 48 89 7.f.D$2..H.D$2H.
0x0130 84 24 38 01 00 00 84 00 c6 44 24 32 01 48 8b 84 .$8......D$2.H..
0x0140 24 38 01 00 00 84 00 c6 40 01 01 48 8b 84 24 38 $8......@..H..$8
0x0150 01 00 00 48 89 84 24 20 01 00 00 48 8d 05 00 00 ...H..$ ...H....
0x0160 00 00 48 89 84 24 68 01 00 00 48 c7 84 24 70 01 ..H..$h...H..$p.
0x0170 00 00 06 00 00 00 eb 00 eb 00 48 8d 05 00 00 00 ..........H.....
0x0180 00 48 89 84 24 58 01 00 00 48 c7 84 24 60 01 00 .H..$X...H..$`..
0x0190 00 01 00 00 00 48 8d 44 24 78 48 89 04 24 48 8b .....H.D$xH..$H.
0x01a0 84 24 70 01 00 00 48 8b 8c 24 68 01 00 00 48 89 .$p...H..$h...H.
0x01b0 4c 24 08 48 89 44 24 10 e8 00 00 00 00 48 8b 44 L$.H.D$......H.D
0x01c0 24 28 48 8b 4c 24 20 48 8b 54 24 18 48 89 94 24 $(H.L$ H.T$.H..$
0x01d0 20 02 00 00 48 89 8c 24 28 02 00 00 48 89 84 24 ...H..$(...H..$
0x01e0 30 02 00 00 48 8d 84 24 98 00 00 00 48 89 04 24 0...H..$....H..$
0x01f0 48 8b 84 24 70 01 00 00 48 8b 8c 24 68 01 00 00 H..$p...H..$h...
0x0200 48 89 4c 24 08 48 89 44 24 10 e8 00 00 00 00 48 H.L$.H.D$......H
0x0210 8b 44 24 20 48 8b 4c 24 28 48 8b 54 24 18 48 89 .D$ H.L$(H.T$.H.
0x0220 94 24 d8 01 00 00 48 89 84 24 e0 01 00 00 48 89 .$....H..$....H.
0x0230 8c 24 e8 01 00 00 48 8d 5c 24 58 48 89 1c 24 48 .$....H.$XH..$H
0x0240 89 54 24 08 48 89 44 24 10 48 89 4c 24 18 e8 00 .T$.H.D$.H.L$...
0x0250 00 00 00 48 8b 44 24 28 48 8b 4c 24 20 48 89 8c ...H.D$(H.L$ H..
0x0260 24 48 01 00 00 48 89 84 24 50 01 00 00 48 c7 84 $H...H..$P...H..
0x0270 24 c0 01 00 00 00 00 00 00 0f 57 c0 0f 11 84 24 $.........W....$
0x0280 c8 01 00 00 48 8d 44 24 30 84 00 eb 00 48 89 84 ....H.D$0....H..
0x0290 24 a8 01 00 00 0f 57 c0 0f 11 84 24 b0 01 00 00 $.....W....$....
0x02a0 48 8d 44 24 30 48 89 84 24 30 01 00 00 84 00 eb H.D$0H..$0......
0x02b0 00 48 89 84 24 90 01 00 00 0f 57 c0 0f 11 84 24 .H..$.....W....$
0x02c0 98 01 00 00 48 8d 44 24 40 48 89 84 24 28 01 00 ....H.D$@H..$(..
0x02d0 00 84 00 48 8b 05 00 00 00 00 48 89 44 24 40 0f ...H......H.D$@.
0x02e0 10 05 00 00 00 00 0f 11 44 24 48 48 8b 84 24 28 ........D$HH..$(
0x02f0 01 00 00 84 00 eb 00 48 89 84 24 78 01 00 00 48 .......H..$x...H
0x0300 c7 84 24 80 01 00 00 03 00 00 00 48 c7 84 24 88 ..$........H..$.
0x0310 01 00 00 03 00 00 00 48 8b ac 24 38 02 00 00 48 .......H..$8...H
0x0320 81 c4 40 02 00 00 c3 e8 00 00 00 00 e9 cf fc ff ..@.............
0x0330 ff .
rel 5+4 t=16 TLS+0
rel 215+4 t=15 "".statictmp_0+0
rel 222+4 t=15 "".statictmp_0+4
rel 350+4 t=15 go.string."sasasa"+0
rel 381+4 t=15 go.string."sasasa"+1
rel 441+4 t=8 runtime.stringtoslicebyte+0
rel 523+4 t=8 runtime.stringtoslicerune+0
rel 591+4 t=8 runtime.slicerunetostring+0
rel 726+4 t=15 "".statictmp_1+0
rel 738+4 t=15 "".statictmp_1+8
rel 808+4 t=8 runtime.morestack_noctxt+0
位置 | 变量 | 注释 |
---|---|---|
576(sp) | 函数返回点, 调用函数的时候回先 | |
568(sp) | BP | |
560(SP) | ab | slice |
552(SP) | ab | slice |
544(SP) | ab | slice |
536(SP) | acb1 | slice |
528(SP) | acb1 | slice |
520(SP) | acb1 | slice |
512(SP) | acd1 | slice |
504(SP) | acd1 | slice |
496(SP) | acd1 | slice |
488(SP) | ar | slice |
480(SP) | ar | slice |
472(SP) | ar | slice |
464(SP) | cc | slice |
456(SP) | cc | slice |
448(SP) | cc | slice |
440(SP) | cc2 | slice |
432(SP) | cc2 | slice |
424(SP) | cc2 | slice |
368(SP) | as | string |
360(SP) | as | string |
352(SP) | as1 | string |
344(SP) | as1 | string |
336(SP) | as2 | string |
328(SP) | as2 | string |
320(SP) | autotmp_14 | acb读取的值 |
312(SP) | autotmp_16 | abb读取的值 |
304(SP) | autotmp_22 | autotmp_24, autotmp_24 位置 |
296(SP) | autotmp_25 | cc4数组 位置 |
288(SP) | abb | 指向数组的指针 |
280(SP) | acb | 指向数组的指针 |
152(SP) | autotmp_19 | stringtoslicerune的第一个参数, 类型是*runtime.tmpBuf占32Bit |
120(SP) | autotmp_18 | stringtoslicebyte的第一个参数, 类型是*runtime.tmpBuf占32Bit |
88(SP) | autotmp_20 | slicerunetostring的第一个参数, 类型是*runtime.tmpBuf占32Bit |
80(SP) | autotmp_26 | 变量c4的指向数组 |
72(SP) | autotmp_26 | 变量c4的指向数组 |
64(SP) | autotmp_26 | 变量c4的指向数组 |
62(SP) | autotmp_15 | 变量acb的指向数组 |
58(SP) | autotmp_15 | 变量acb的指向数组 |
54(SP) | acd[2:] | 数组[2] |
52(SP) | acd | 数组 |
50(SP) | autotmp_17 | 变量abb的指向数组, 2Bit |
48(SP) | autotmp_24, autotmp_24 | cc3, cc2,指针指向的位置 |
有疑问加站长微信联系(非本文作者)