go 生成hash_go基础之map写在前面(一)

为什么分析map

在计算机编程语言当中,用的最多的数据结构估计就是map。map以他近乎o(1)的查找效率和修改效率让他在大多数场景下都比较受青睐。map的常规的实现方式都是hash+其他数据结构,如java是hash+红黑树,而我现在即将要分析的go的实现方式是hash+链表。我会分析map的几乎每段代码,并且在我的GitHub可以查看到我的分析,注释十分详尽,欢迎批评指正。我的打算是把一些常用的数据结构都分析一遍,如果有志同道合的人,可以联系我。

我的环境

为了给那些感兴趣看源码分析我的博客的同学阅读得更加清晰,列举了我的环境:

  1. go1.14.7 amd64

  2. windows和mac接口,linux没有测试,估计没问题 ;

  3. goland,目前最好的golang ide,虽然笔者用起来感觉还是不太完美

  4. 着重分析map[string]string,其他类型的源码变化不大 ;

本篇重点

1.go的map和java的map有区别,go中是一个关键字,而java确实可以直接查看源码,那么如何分析go的map源码?
2.调试过程当中,go充斥着大量指针,如何知道指针指向的内容?map的最小单位bmap除了查看tophash,怎么查看里面的其他隐藏字段?
3.go的map源码为何给不同的key的类型设计不同的实现?
4.其他一些查看源码的小技巧:内存对齐、指针偏移、类型大小等等

如何找到map对应的源码

go的map的结构体是hmap,代码位于runtime/map.go,当编译器编译你申明使用map的源码时候,其实是使用了runtime/map*.go,后面对map的增删改查都是执行该代码,故要弄懂map的底层原理只需要分析该源码,也可以断点调试。
我下面有个自己测试的源码,注意我编译之后查看,就可以发现端倪:

 1package main
2
3import "fmt"
4
5func main() {
6    m1 := make(map[string]string)
7    fmt.Println(m1)
8    m2 := make(map[string]string, 8)
9    fmt.Println(m2)
10    m3 := make(map[string]string, 9)
11    fmt.Println(m3)
12    m4 := map[string]string{}
13    fmt.Println(m4)
14    m3["1"] = "2"
15    for k, v := range m3 {
16        fmt.Println(k)
17        fmt.Println(v)
18    }
19    v1 := m3["1"]
20    fmt.Println(v1)
21    if v2, ok := m3["1"]; ok {
22        fmt.Println(v2)
23    }
24}

上面代码有几种不同申明map的方式,对应runtime/map.go也不同。还有赋值和遍历查找的代码。
下面编译得到汇编指令文件,执行

1go tool compile -N -l -S main.go > main.txt

生成了汇编指令文件:

   1"".main STEXT size=1891 args=0x0 locals=0x288
2    0x0000 00000 (main.go:5)    TEXT    "".main(SB), ABIInternal, $648-0
3    0x0000 00000 (main.go:5)    MOVQ    TLS, CX
4    0x0009 00009 (main.go:5)    PCDATA  $0, $-2
5    0x0009 00009 (main.go:5)    MOVQ    (CX)(TLS*2), CX
6    0x0010 00016 (main.go:5)    PCDATA  $0, $-1
7    0x0010 00016 (main.go:5)    LEAQ    -520(SP), AX
8    0x0018 00024 (main.go:5)    CMPQ    AX, 16(CX)
9    0x001c 00028 (main.go:5)    PCDATA  $0, $-2
10    0x001c 00028 (main.go:5)    JLS 1881
11    0x0022 00034 (main.go:5)    PCDATA  $0, $-1
12    0x0022 00034 (main.go:5)    SUBQ    $648, SP
13    0x0029 00041 (main.go:5)    MOVQ    BP, 640(SP)
14    0x0031 00049 (main.go:5)    LEAQ    640(SP), BP
15    0x0039 00057 (main.go:5)    PCDATA  $0, $-2
16    0x0039 00057 (main.go:5)    PCDATA  $1, $-2
17    0x0039 00057 (main.go:5)    FUNCDATA    $0, gclocals·ad6397d3d33bbb6a31b1320349e23274(SB)
18    0x0039 00057 (main.go:5)    FUNCDATA    $1, gclocals·1bbf1965a34fa71a63e073b1cf2d752a(SB)
19    0x0039 00057 (main.go:5)    FUNCDATA    $2, gclocals·658035074399f748be6dd39603d5113c(SB)
20    0x0039 00057 (main.go:5)    FUNCDATA    $3, "".main.stkobj(SB)
21    0x0039 00057 (main.go:6)    PCDATA  $0, $0
22    0x0039 00057 (main.go:6)    PCDATA  $1, $0
23    0x0039 00057 (main.go:6)    CALL    runtime.makemap_small(SB)
24    0x003e 00062 (main.go:6)    PCDATA  $0, $1
25    0x003e 00062 (main.go:6)    MOVQ    (SP), AX
26    0x0042 00066 (main.go:6)    MOVQ    AX, "".m1+80(SP)
27    0x0047 00071 (main.go:7)    PCDATA  $0, $0
28    0x0047 00071 (main.go:7)    PCDATA  $1, $1
29    0x0047 00071 (main.go:7)    MOVQ    AX, ""..autotmp_10+200(SP)
30    0x004f 00079 (main.go:7)    PCDATA  $1, $2
31    0x004f 00079 (main.go:7)    XORPS   X0, X0
32    0x0052 00082 (main.go:7)    MOVUPS  X0, ""..autotmp_9+272(SP)
33    0x005a 00090 (main.go:7)    PCDATA  $0, $1
34    0x005a 00090 (main.go:7)    PCDATA  $1, $1
35    0x005a 00090 (main.go:7)    LEAQ    ""..autotmp_9+272(SP), AX
36    0x0062 00098 (main.go:7)    MOVQ    AX, ""..autotmp_15+192(SP)
37    0x006a 00106 (main.go:7)    TESTB   AL, (AX)
38    0x006c 00108 (main.go:7)    PCDATA  $0, $2
39    0x006c 00108 (main.go:7)    PCDATA  $1, $0
40    0x006c 00108 (main.go:7)    MOVQ    ""..autotmp_10+200(SP), CX
41    0x0074 00116 (main.go:7)    PCDATA  $0, $3
42    0x0074 00116 (main.go:7)    LEAQ    type.map[string]string(SB), DX
43    0x007b 00123 (main.go:7)    PCDATA  $0, $2
44    0x007b 00123 (main.go:7)    MOVQ    DX, ""..autotmp_9+272(SP)
45    0x0083 00131 (main.go:7)    PCDATA  $0, $1
46    0x0083 00131 (main.go:7)    MOVQ    CX, ""..autotmp_9+280(SP)
47    0x008b 00139 (main.go:7)    TESTB   AL, (AX)
48    0x008d 00141 (main.go:7)    JMP 143
49    0x008f 00143 (main.go:7)    MOVQ    AX, ""..autotmp_14+520(SP)
50    0x0097 00151 (main.go:7)    MOVQ    $1, ""..autotmp_14+528(SP)
51    0x00a3 00163 (main.go:7)    MOVQ    $1, ""..autotmp_14+536(SP)
52    0x00af 00175 (main.go:7)    PCDATA  $0, $0
53    0x00af 00175 (main.go:7)    MOVQ    AX, (SP)
54    0x00b3 00179 (main.go:7)    MOVQ    $1, 8(SP)
55    0x00bc 00188 (main.go:7)    MOVQ    $1, 16(SP)
56    0x00c5 00197 (main.go:7)    CALL    fmt.Println(SB)
57    0x00ca 00202 (main.go:8)    CALL    runtime.makemap_small(SB)
58    0x00cf 00207 (main.go:8)    PCDATA  $0, $1
59    0x00cf 00207 (main.go:8)    MOVQ    (SP), AX
60    0x00d3 00211 (main.go:8)    MOVQ    AX, "".m2+72(SP)
61    0x00d8 00216 (main.go:9)    PCDATA  $0, $0
62    0x00d8 00216 (main.go:9)    PCDATA  $1, $1
63    0x00d8 00216 (main.go:9)    MOVQ    AX, ""..autotmp_10+200(SP)
64    0x00e0 00224 (main.go:9)    PCDATA  $1, $2
65    0x00e0 00224 (main.go:9)    XORPS   X0, X0
66    0x00e3 00227 (main.go:9)    MOVUPS  X0, ""..autotmp_9+272(SP)
67    0x00eb 00235 (main.go:9)    PCDATA  $0, $1
68    0x00eb 00235 (main.go:9)    PCDATA  $1, $1
69    0x00eb 00235 (main.go:9)    LEAQ    ""..autotmp_9+272(SP), AX
70    0x00f3 00243 (main.go:9)    MOVQ    AX, ""..autotmp_17+184(SP)
71    0x00fb 00251 (main.go:9)    TESTB   AL, (AX)
72    0x00fd 00253 (main.go:9)    PCDATA  $0, $2
73    0x00fd 00253 (main.go:9)    PCDATA  $1, $0
74    0x00fd 00253 (main.go:9)    MOVQ    ""..autotmp_10+200(SP), CX
75    0x0105 00261 (main.go:9)    PCDATA  $0, $3
76    0x0105 00261 (main.go:9)    LEAQ    type.map[string]string(SB), DX
77    0x010c 00268 (main.go:9)    PCDATA  $0, $2
78    0x010c 00268 (main.go:9)    MOVQ    DX, ""..autotmp_9+272(SP)
79    0x0114 00276 (main.go:9)    PCDATA  $0, $1
80    0x0114 00276 (main.go:9)    MOVQ    CX, ""..autotmp_9+280(SP)
81    0x011c 00284 (main.go:9)    TESTB   AL, (AX)
82    0x011e 00286 (main.go:9)    JMP 288
83    0x0120 00288 (main.go:9)    MOVQ    AX, ""..autotmp_16+496(SP)
84    0x0128 00296 (main.go:9)    MOVQ    $1, ""..autotmp_16+504(SP)
85    0x0134 00308 (main.go:9)    MOVQ    $1, ""..autotmp_16+512(SP)
86    0x0140 00320 (main.go:9)    PCDATA  $0, $0
87    0x0140 00320 (main.go:9)    MOVQ    AX, (SP)
88    0x0144 00324 (main.go:9)    MOVQ    $1, 8(SP)
89    0x014d 00333 (main.go:9)    MOVQ    $1, 16(SP)
90    0x0156 00342 (main.go:9)    CALL    fmt.Println(SB)
91    0x015b 00347 (main.go:10)   PCDATA  $0, $1
92    0x015b 00347 (main.go:10)   LEAQ    type.map[string]string(SB), AX
93    0x0162 00354 (main.go:10)   PCDATA  $0, $0
94    0x0162 00354 (main.go:10)   MOVQ    AX, (SP)
95    0x0166 00358 (main.go:10)   MOVQ    $9, 8(SP)
96    0x016f 00367 (main.go:10)   MOVQ    $0, 16(SP)
97    0x0178 00376 (main.go:10)   CALL    runtime.makemap(SB)
98    0x017d 00381 (main.go:10)   PCDATA  $0, $1
99    0x017d 00381 (main.go:10)   MOVQ    24(SP), AX
100    0x0182 00386 (main.go:10)   PCDATA  $1, $3
101    0x0182 00386 (main.go:10)   MOVQ    AX, "".m3+64(SP)
102    0x0187 00391 (main.go:11)   PCDATA  $0, $0
103    0x0187 00391 (main.go:11)   PCDATA  $1, $4
104    0x0187 00391 (main.go:11)   MOVQ    AX, ""..autotmp_10+200(SP)
105    0x018f 00399 (main.go:11)   PCDATA  $1, $5
106    0x018f 00399 (main.go:11)   XORPS   X0, X0
107    0x0192 00402 (main.go:11)   MOVUPS  X0, ""..autotmp_9+272(SP)
108    0x019a 00410 (main.go:11)   PCDATA  $0, $1
109    0x019a 00410 (main.go:11)   PCDATA  $1, $4
110    0x019a 00410 (main.go:11)   LEAQ    ""..autotmp_9+272(SP), AX
111    0x01a2 00418 (main.go:11)   MOVQ    AX, ""..autotmp_19+176(SP)
112    0x01aa 00426 (main.go:11)   TESTB   AL, (AX)
113    0x01ac 00428 (main.go:11)   PCDATA  $0, $2
114    0x01ac 00428 (main.go:11)   PCDATA  $1, $3
115    0x01ac 00428 (main.go:11)   MOVQ    ""..autotmp_10+200(SP), CX
116    0x01b4 00436 (main.go:11)   PCDATA  $0, $3
117    0x01b4 00436 (main.go:11)   LEAQ    type.map[string]string(SB), DX
118    0x01bb 00443 (main.go:11)   PCDATA  $0, $2
119    0x01bb 00443 (main.go:11)   MOVQ    DX, ""..autotmp_9+272(SP)
120    0x01c3 00451 (main.go:11)   PCDATA  $0, $1
121    0x01c3 00451 (main.go:11)   MOVQ    CX, ""..autotmp_9+280(SP)
122    0x01cb 00459 (main.go:11)   TESTB   AL, (AX)
123    0x01cd 00461 (main.go:11)   JMP 463
124    0x01cf 00463 (main.go:11)   MOVQ    AX, ""..autotmp_18+472(SP)
125    0x01d7 00471 (main.go:11)   MOVQ    $1, ""..autotmp_18+480(SP)
126    0x01e3 00483 (main.go:11)   MOVQ    $1, ""..autotmp_18+488(SP)
127    0x01ef 00495 (main.go:11)   PCDATA  $0, $0
128    0x01ef 00495 (main.go:11)   MOVQ    AX, (SP)
129    0x01f3 00499 (main.go:11)   MOVQ    $1, 8(SP)
130    0x01fc 00508 (main.go:11)   MOVQ    $1, 16(SP)
131    0x0205 00517 (main.go:11)   CALL    fmt.Println(SB)
132    0x020a 00522 (main.go:12)   CALL    runtime.makemap_small(SB)
133    0x020f 00527 (main.go:12)   PCDATA  $0, $1
134    0x020f 00527 (main.go:12)   MOVQ    (SP), AX
135    0x0213 00531 (main.go:12)   PCDATA  $0, $0
136    0x0213 00531 (main.go:12)   PCDATA  $1, $6
137    0x0213 00531 (main.go:12)   MOVQ    AX, "".m4+56(SP)
138    0x0218 00536 (main.go:13)   PCDATA  $0, $1
139    0x0218 00536 (main.go:13)   PCDATA  $1, $3
140    0x0218 00536 (main.go:13)   MOVQ    "".m4+56(SP), AX
141    0x021d 00541 (main.go:13)   PCDATA  $0, $0
142    0x021d 00541 (main.go:13)   PCDATA  $1, $4
143    0x021d 00541 (main.go:13)   MOVQ    AX, ""..autotmp_10+200(SP)
144    0x0225 00549 (main.go:13)   PCDATA  $1, $5
145    0x0225 00549 (main.go:13)   XORPS   X0, X0
146    0x0228 00552 (main.go:13)   MOVUPS  X0, ""..autotmp_9+272(SP)
147    0x0230 00560 (main.go:13)   PCDATA  $0, $1
148    0x0230 00560 (main.go:13)   PCDATA  $1, $4
149    0x0230 00560 (main.go:13)   LEAQ    ""..autotmp_9+272(SP), AX
150    0x0238 00568 (main.go:13)   MOVQ    AX, ""..autotmp_23+168(SP)
151    0x0240 00576 (main.go:13)   TESTB   AL, (AX)
152    0x0242 00578 (main.go:13)   PCDATA  $0, $2
153    0x0242 00578 (main.go:13)   PCDATA  $1, $3
154    0x0242 00578 (main.go:13)   MOVQ    ""..autotmp_10+200(SP), CX
155    0x024a 00586 (main.go:13)   PCDATA  $0, $3
156    0x024a 00586 (main.go:13)   LEAQ    type.map[string]string(SB), DX
157    0x0251 00593 (main.go:13)   PCDATA  $0, $2
158    0x0251 00593 (main.go:13)   MOVQ    DX, ""..autotmp_9+272(SP)
159    0x0259 00601 (main.go:13)   PCDATA  $0, $1
160    0x0259 00601 (main.go:13)   MOVQ    CX, ""..autotmp_9+280(SP)
161    0x0261 00609 (main.go:13)   TESTB   AL, (AX)
162    0x0263 00611 (main.go:13)   JMP 613
163    0x0265 00613 (main.go:13)   MOVQ    AX, ""..autotmp_22+448(SP)
164    0x026d 00621 (main.go:13)   MOVQ    $1, ""..autotmp_22+456(SP)
165    0x0279 00633 (main.go:13)   MOVQ    $1, ""..autotmp_22+464(SP)
166    0x0285 00645 (main.go:13)   PCDATA  $0, $0
167    0x0285 00645 (main.go:13)   MOVQ    AX, (SP)
168    0x0289 00649 (main.go:13)   MOVQ    $1, 8(SP)
169    0x0292 00658 (main.go:13)   MOVQ    $1, 16(SP)
170    0x029b 00667 (main.go:13)   CALL    fmt.Println(SB)
171    0x02a0 00672 (main.go:14)   PCDATA  $0, $1
172    0x02a0 00672 (main.go:14)   LEAQ    type.map[string]string(SB), AX
173    0x02a7 00679 (main.go:14)   PCDATA  $0, $0
174    0x02a7 00679 (main.go:14)   MOVQ    AX, (SP)
175    0x02ab 00683 (main.go:14)   PCDATA  $0, $1
176    0x02ab 00683 (main.go:14)   MOVQ    "".m3+64(SP), AX
177    0x02b0 00688 (main.go:14)   PCDATA  $0, $0
178    0x02b0 00688 (main.go:14)   MOVQ    AX, 8(SP)
179    0x02b5 00693 (main.go:14)   PCDATA  $0, $1
180    0x02b5 00693 (main.go:14)   LEAQ    go.string."1"(SB), AX
181    0x02bc 00700 (main.go:14)   PCDATA  $0, $0
182    0x02bc 00700 (main.go:14)   MOVQ    AX, 16(SP)
183    0x02c1 00705 (main.go:14)   MOVQ    $1, 24(SP)
184    0x02ca 00714 (main.go:14)   CALL    runtime.mapassign_faststr(SB)
185    0x02cf 00719 (main.go:14)   PCDATA  $0, $4
186    0x02cf 00719 (main.go:14)   MOVQ    32(SP), DI
187    0x02d4 00724 (main.go:14)   MOVQ    DI, ""..autotmp_24+160(SP)
188    0x02dc 00732 (main.go:14)   TESTB   AL, (DI)
189    0x02de 00734 (main.go:14)   MOVQ    $1, 8(DI)
190    0x02e6 00742 (main.go:14)   PCDATA  $0, $-2
191    0x02e6 00742 (main.go:14)   PCDATA  $1, $-2
192    0x02e6 00742 (main.go:14)   CMPL    runtime.writeBarrier(SB), $0
193    0x02ed 00749 (main.go:14)   JEQ 756
194    0x02ef 00751 (main.go:14)   JMP 1864
195    0x02f4 00756 (main.go:14)   LEAQ    go.string."2"(SB), AX
196    0x02fb 00763 (main.go:14)   MOVQ    AX, (DI)
197    0x02fe 00766 (main.go:14)   JMP 768
198    0x0300 00768 (main.go:15)   PCDATA  $0, $1
199    0x0300 00768 (main.go:15)   PCDATA  $1, $3
200    0x0300 00768 (main.go:15)   MOVQ    "".m3+64(SP), AX
201    0x0305 00773 (main.go:15)   PCDATA  $0, $0
202    0x0305 00773 (main.go:15)   PCDATA  $1, $4
203    0x0305 00773 (main.go:15)   MOVQ    AX, ""..autotmp_10+200(SP)
204    0x030d 00781 (main.go:15)   PCDATA  $0, $4
205    0x030d 00781 (main.go:15)   PCDATA  $1, $7
206    0x030d 00781 (main.go:15)   LEAQ    ""..autotmp_11+544(SP), DI
207    0x0315 00789 (main.go:15)   XORPS   X0, X0
208    0x0318 00792 (main.go:15)   PCDATA  $0, $0
209    0x0318 00792 (main.go:15)   LEAQ    -32(DI), DI
210    0x031c 00796 (main.go:15)   DUFFZERO    $273
211    0x032f 00815 (main.go:15)   PCDATA  $0, $1
212    0x032f 00815 (main.go:15)   LEAQ    type.map[string]string(SB), AX
213    0x0336 00822 (main.go:15)   PCDATA  $0, $0
214    0x0336 00822 (main.go:15)   MOVQ    AX, (SP)
215    0x033a 00826 (main.go:15)   PCDATA  $0, $1
216    0x033a 00826 (main.go:15)   PCDATA  $1, $8
217    0x033a 00826 (main.go:15)   MOVQ    ""..autotmp_10+200(SP), AX
218    0x0342 00834 (main.go:15)   PCDATA  $0, $0
219    0x0342 00834 (main.go:15)   MOVQ    AX, 8(SP)
220    0x0347 00839 (main.go:15)   PCDATA  $0, $1
221    0x0347 00839 (main.go:15)   LEAQ    ""..autotmp_11+544(SP), AX
222    0x034f 00847 (main.go:15)   PCDATA  $0, $0
223    0x034f 00847 (main.go:15)   MOVQ    AX, 16(SP)
224    0x0354 00852 (main.go:15)   CALL    runtime.mapiterinit(SB)
225    0x0359 00857 (main.go:15)   JMP 859
226    0x035b 00859 (main.go:15)   CMPQ    ""..autotmp_11+544(SP), $0
227    0x0364 00868 (main.go:15)   JNE 875
228    0x0366 00870 (main.go:15)   JMP 1329
229    0x036b 00875 (main.go:15)   PCDATA  $0, $1
230    0x036b 00875 (main.go:15)   MOVQ    ""..autotmp_11+552(SP), AX
231    0x0373 00883 (main.go:15)   TESTB   AL, (AX)
232    0x0375 00885 (main.go:15)   MOVQ    8(AX), CX
233    0x0379 00889 (main.go:15)   MOVQ    (AX), AX
234    0x037c 00892 (main.go:15)   PCDATA  $0, $0
235    0x037c 00892 (main.go:15)   PCDATA  $1, $9
236    0x037c 00892 (main.go:15)   MOVQ    AX, ""..autotmp_25+288(SP)
237    0x0384 00900 (main.go:15)   MOVQ    CX, ""..autotmp_25+296(SP)
238    0x038c 00908 (main.go:15)   PCDATA  $0, $1
239    0x038c 00908 (main.go:15)   MOVQ    ""..autotmp_11+544(SP), AX
240    0x0394 00916 (main.go:15)   TESTB   AL, (AX)
241    0x0396 00918 (main.go:15)   MOVQ    8(AX), CX
242    0x039a 00922 (main.go:15)   MOVQ    (AX), AX
243    0x039d 00925 (main.go:15)   PCDATA  $0, $0
244    0x039d 00925 (main.go:15)   PCDATA  $1, $10
245    0x039d 00925 (main.go:15)   MOVQ    AX, "".k+256(SP)
246    0x03a5 00933 (main.go:15)   MOVQ    CX, "".k+264(SP)
247    0x03ad 00941 (main.go:15)   MOVQ    ""..autotmp_25+296(SP), AX
248    0x03b5 00949 (main.go:15)   PCDATA  $0, $5
249    0x03b5 00949 (main.go:15)   PCDATA  $1, $11
250    0x03b5 00949 (main.go:15)   MOVQ    ""..autotmp_25+288(SP), CX
251    0x03bd 00957 (main.go:15)   PCDATA  $0, $0
252    0x03bd 00957 (main.go:15)   PCDATA  $1, $12
253    0x03bd 00957 (main.go:15)   MOVQ    CX, "".v+240(SP)
254    0x03c5 00965 (main.go:15)   MOVQ    AX, "".v+248(SP)
255    0x03cd 00973 (main.go:16)   MOVQ    "".k+264(SP), AX
256    0x03d5 00981 (main.go:16)   PCDATA  $0, $5
257    0x03d5 00981 (main.go:16)   PCDATA  $1, $13
258    0x03d5 00981 (main.go:16)   MOVQ    "".k+256(SP), CX
259    0x03dd 00989 (main.go:16)   PCDATA  $0, $0
260    0x03dd 00989 (main.go:16)   MOVQ    CX, (SP)
261    0x03e1 00993 (main.go:16)   MOVQ    AX, 8(SP)
262    0x03e6 00998 (main.go:16)   CALL    runtime.convTstring(SB)
263    0x03eb 01003 (main.go:16)   PCDATA  $0, $1
264    0x03eb 01003 (main.go:16)   MOVQ    16(SP), AX
265    0x03f0 01008 (main.go:16)   PCDATA  $0, $0
266    0x03f0 01008 (main.go:16)   PCDATA  $1, $14
267    0x03f0 01008 (main.go:16)   MOVQ    AX, ""..autotmp_26+152(SP)
268    0x03f8 01016 (main.go:16)   PCDATA  $1, $15
269    0x03f8 01016 (main.go:16)   XORPS   X0, X0
270    0x03fb 01019 (main.go:16)   MOVUPS  X0, ""..autotmp_9+272(SP)
271    0x0403 01027 (main.go:16)   PCDATA  $0, $1
272    0x0403 01027 (main.go:16)   PCDATA  $1, $14
273    0x0403 01027 (main.go:16)   LEAQ    ""..autotmp_9+272(SP), AX
274    0x040b 01035 (main.go:16)   MOVQ    AX, ""..autotmp_28+144(SP)
275    0x0413 01043 (main.go:16)   TESTB   AL, (AX)
276    0x0415 01045 (main.go:16)   PCDATA  $0, $2
277    0x0415 01045 (main.go:16)   PCDATA  $1, $13
278    0x0415 01045 (main.go:16)   MOVQ    ""..autotmp_26+152(SP), CX
279    0x041d 01053 (main.go:16)   PCDATA  $0, $3
280    0x041d 01053 (main.go:16)   LEAQ    type.string(SB), DX
281    0x0424 01060 (main.go:16)   PCDATA  $0, $2
282    0x0424 01060 (main.go:16)   MOVQ    DX, ""..autotmp_9+272(SP)
283    0x042c 01068 (main.go:16)   PCDATA  $0, $1
284    0x042c 01068 (main.go:16)   MOVQ    CX, ""..autotmp_9+280(SP)
285    0x0434 01076 (main.go:16)   TESTB   AL, (AX)
286    0x0436 01078 (main.go:16)   JMP 1080
287    0x0438 01080 (main.go:16)   MOVQ    AX, ""..autotmp_27+424(SP)
288    0x0440 01088 (main.go:16)   MOVQ    $1, ""..autotmp_27+432(SP)
289    0x044c 01100 (main.go:16)   MOVQ    $1, ""..autotmp_27+440(SP)
290    0x0458 01112 (main.go:16)   PCDATA  $0, $0
291    0x0458 01112 (main.go:16)   MOVQ    AX, (SP)
292    0x045c 01116 (main.go:16)   MOVQ    $1, 8(SP)
293    0x0465 01125 (main.go:16)   MOVQ    $1, 16(SP)
294    0x046e 01134 (main.go:16)   CALL    fmt.Println(SB)
295    0x0473 01139 (main.go:17)   MOVQ    "".v+248(SP), AX
296    0x047b 01147 (main.go:17)   PCDATA  $0, $5
297    0x047b 01147 (main.go:17)   PCDATA  $1, $8
298    0x047b 01147 (main.go:17)   MOVQ    "".v+240(SP), CX
299    0x0483 01155 (main.go:17)   PCDATA  $0, $0
300    0x0483 01155 (main.go:17)   MOVQ    CX, (SP)
301    0x0487 01159 (main.go:17)   MOVQ    AX, 8(SP)
302    0x048c 01164 (main.go:17)   CALL    runtime.convTstring(SB)
303    0x0491 01169 (main.go:17)   PCDATA  $0, $1
304    0x0491 01169 (main.go:17)   MOVQ    16(SP), AX
305    0x0496 01174 (main.go:17)   PCDATA  $0, $0
306    0x0496 01174 (main.go:17)   PCDATA  $1, $16
307    0x0496 01174 (main.go:17)   MOVQ    AX, ""..autotmp_29+136(SP)
308    0x049e 01182 (main.go:17)   PCDATA  $1, $17
309    0x049e 01182 (main.go:17)   XORPS   X0, X0
310    0x04a1 01185 (main.go:17)   MOVUPS  X0, ""..autotmp_9+272(SP)
311    0x04a9 01193 (main.go:17)   PCDATA  $0, $1
312    0x04a9 01193 (main.go:17)   PCDATA  $1, $16
313    0x04a9 01193 (main.go:17)   LEAQ    ""..autotmp_9+272(SP), AX
314    0x04b1 01201 (main.go:17)   MOVQ    AX, ""..autotmp_31+128(SP)
315    0x04b9 01209 (main.go:17)   TESTB   AL, (AX)
316    0x04bb 01211 (main.go:17)   PCDATA  $0, $2
317    0x04bb 01211 (main.go:17)   PCDATA  $1, $8
318    0x04bb 01211 (main.go:17)   MOVQ    ""..autotmp_29+136(SP), CX
319    0x04c3 01219 (main.go:17)   PCDATA  $0, $3
320    0x04c3 01219 (main.go:17)   LEAQ    type.string(SB), DX
321    0x04ca 01226 (main.go:17)   PCDATA  $0, $2
322    0x04ca 01226 (main.go:17)   MOVQ    DX, ""..autotmp_9+272(SP)
323    0x04d2 01234 (main.go:17)   PCDATA  $0, $1
324    0x04d2 01234 (main.go:17)   MOVQ    CX, ""..autotmp_9+280(SP)
325    0x04da 01242 (main.go:17)   TESTB   AL, (AX)
326    0x04dc 01244 (main.go:17)   JMP 1246
327    0x04de 01246 (main.go:17)   MOVQ    AX, ""..autotmp_30+400(SP)
328    0x04e6 01254 (main.go:17)   MOVQ    $1, ""..autotmp_30+408(SP)
329    0x04f2 01266 (main.go:17)   MOVQ    $1, ""..autotmp_30+416(SP)
330    0x04fe 01278 (main.go:17)   PCDATA  $0, $0
331    0x04fe 01278 (main.go:17)   MOVQ    AX, (SP)
332    0x0502 01282 (main.go:17)   MOVQ    $1, 8(SP)
333    0x050b 01291 (main.go:17)   MOVQ    $1, 16(SP)
334    0x0514 01300 (main.go:17)   CALL    fmt.Println(SB)
335    0x0519 01305 (main.go:17)   JMP 1307
336    0x051b 01307 (main.go:15)   PCDATA  $0, $1
337    0x051b 01307 (main.go:15)   LEAQ    ""..autotmp_11+544(SP), AX
338    0x0523 01315 (main.go:15)   PCDATA  $0, $0
339    0x0523 01315 (main.go:15)   MOVQ    AX, (SP)
340    0x0527 01319 (main.go:15)   CALL    runtime.mapiternext(SB)
341    0x052c 01324 (main.go:15)   JMP 859
342    0x0531 01329 (main.go:19)   PCDATA  $0, $1
343    0x0531 01329 (main.go:19)   PCDATA  $1, $3
344    0x0531 01329 (main.go:19)   LEAQ    type.map[string]string(SB), AX
345    0x0538 01336 (main.go:19)   PCDATA  $0, $0
346    0x0538 01336 (main.go:19)   MOVQ    AX, (SP)
347    0x053c 01340 (main.go:19)   PCDATA  $0, $1
348    0x053c 01340 (main.go:19)   MOVQ    "".m3+64(SP), AX
349    0x0541 01345 (main.go:19)   PCDATA  $0, $0
350    0x0541 01345 (main.go:19)   MOVQ    AX, 8(SP)
351    0x0546 01350 (main.go:19)   PCDATA  $0, $1
352    0x0546 01350 (main.go:19)   LEAQ    go.string."1"(SB), AX
353    0x054d 01357 (main.go:19)   PCDATA  $0, $0
354    0x054d 01357 (main.go:19)   MOVQ    AX, 16(SP)
355    0x0552 01362 (main.go:19)   MOVQ    $1, 24(SP)
356    0x055b 01371 (main.go:19)   CALL    runtime.mapaccess1_faststr(SB)
357    0x0560 01376 (main.go:19)   PCDATA  $0, $1
358    0x0560 01376 (main.go:19)   MOVQ    32(SP), AX
359    0x0565 01381 (main.go:19)   PCDATA  $0, $2
360    0x0565 01381 (main.go:19)   MOVQ    (AX), CX
361    0x0568 01384 (main.go:19)   PCDATA  $0, $5
362    0x0568 01384 (main.go:19)   MOVQ    8(AX), AX
363    0x056c 01388 (main.go:19)   MOVQ    CX, "".v1+224(SP)
364    0x0574 01396 (main.go:19)   MOVQ    AX, "".v1+232(SP)
365    0x057c 01404 (main.go:20)   PCDATA  $0, $0
366    0x057c 01404 (main.go:20)   MOVQ    CX, (SP)
367    0x0580 01408 (main.go:20)   MOVQ    AX, 8(SP)
368    0x0585 01413 (main.go:20)   CALL    runtime.convTstring(SB)
369    0x058a 01418 (main.go:20)   PCDATA  $0, $1
370    0x058a 01418 (main.go:20)   MOVQ    16(SP), AX
371    0x058f 01423 (main.go:20)   PCDATA  $0, $0
372    0x058f 01423 (main.go:20)   PCDATA  $1, $18
373    0x058f 01423 (main.go:20)   MOVQ    AX, ""..autotmp_32+120(SP)
374    0x0594 01428 (main.go:20)   PCDATA  $1, $19
375    0x0594 01428 (main.go:20)   XORPS   X0, X0
376    0x0597 01431 (main.go:20)   MOVUPS  X0, ""..autotmp_9+272(SP)
377    0x059f 01439 (main.go:20)   PCDATA  $0, $1
378    0x059f 01439 (main.go:20)   PCDATA  $1, $18
379    0x059f 01439 (main.go:20)   LEAQ    ""..autotmp_9+272(SP), AX
380    0x05a7 01447 (main.go:20)   MOVQ    AX, ""..autotmp_34+112(SP)
381    0x05ac 01452 (main.go:20)   TESTB   AL, (AX)
382    0x05ae 01454 (main.go:20)   PCDATA  $0, $2
383    0x05ae 01454 (main.go:20)   PCDATA  $1, $3
384    0x05ae 01454 (main.go:20)   MOVQ    ""..autotmp_32+120(SP), CX
385    0x05b3 01459 (main.go:20)   PCDATA  $0, $3
386    0x05b3 01459 (main.go:20)   LEAQ    type.string(SB), DX
387    0x05ba 01466 (main.go:20)   PCDATA  $0, $2
388    0x05ba 01466 (main.go:20)   MOVQ    DX, ""..autotmp_9+272(SP)
389    0x05c2 01474 (main.go:20)   PCDATA  $0, $1
390    0x05c2 01474 (main.go:20)   MOVQ    CX, ""..autotmp_9+280(SP)
391    0x05ca 01482 (main.go:20)   TESTB   AL, (AX)
392    0x05cc 01484 (main.go:20)   JMP 1486
393    0x05ce 01486 (main.go:20)   MOVQ    AX, ""..autotmp_33+376(SP)
394    0x05d6 01494 (main.go:20)   MOVQ    $1, ""..autotmp_33+384(SP)
395    0x05e2 01506 (main.go:20)   MOVQ    $1, ""..autotmp_33+392(SP)
396    0x05ee 01518 (main.go:20)   PCDATA  $0, $0
397    0x05ee 01518 (main.go:20)   MOVQ    AX, (SP)
398    0x05f2 01522 (main.go:20)   MOVQ    $1, 8(SP)
399    0x05fb 01531 (main.go:20)   MOVQ    $1, 16(SP)
400    0x0604 01540 (main.go:20)   CALL    fmt.Println(SB)
401    0x0609 01545 (main.go:21)   XORPS   X0, X0
402    0x060c 01548 (main.go:21)   MOVUPS  X0, ""..autotmp_12+336(SP)
403    0x0614 01556 (main.go:21)   PCDATA  $0, $1
404    0x0614 01556 (main.go:21)   LEAQ    type.map[string]string(SB), AX
405    0x061b 01563 (main.go:21)   PCDATA  $0, $0
406    0x061b 01563 (main.go:21)   MOVQ    AX, (SP)
407    0x061f 01567 (main.go:21)   PCDATA  $0, $1
408    0x061f 01567 (main.go:21)   PCDATA  $1, $0
409    0x061f 01567 (main.go:21)   MOVQ    "".m3+64(SP), AX
410    0x0624 01572 (main.go:21)   PCDATA  $0, $0
411    0x0624 01572 (main.go:21)   MOVQ    AX, 8(SP)
412    0x0629 01577 (main.go:21)   PCDATA  $0, $1
413    0x0629 01577 (main.go:21)   LEAQ    go.string."1"(SB), AX
414    0x0630 01584 (main.go:21)   PCDATA  $0, $0
415    0x0630 01584 (main.go:21)   MOVQ    AX, 16(SP)
416    0x0635 01589 (main.go:21)   MOVQ    $1, 24(SP)
417    0x063e 01598 (main.go:21)   CALL    runtime.mapaccess2_faststr(SB)
418    0x0643 01603 (main.go:21)   PCDATA  $0, $1
419    0x0643 01603 (main.go:21)   MOVQ    32(SP), AX
420    0x0648 01608 (main.go:21)   PCDATA  $0, $0
421    0x0648 01608 (main.go:21)   PCDATA  $1, $20
422    0x0648 01608 (main.go:21)   MOVQ    AX, ""..autotmp_35+104(SP)
423    0x064d 01613 (main.go:21)   MOVBLZX 40(SP), AX
424    0x0652 01618 (main.go:21)   MOVB    AL, ""..autotmp_13+55(SP)
425    0x0656 01622 (main.go:21)   PCDATA  $0, $1
426    0x0656 01622 (main.go:21)   PCDATA  $1, $0
427    0x0656 01622 (main.go:21)   MOVQ    ""..autotmp_35+104(SP), AX
428    0x065b 01627 (main.go:21)   MOVQ    8(AX), CX
429    0x065f 01631 (main.go:21)   MOVQ    (AX), AX
430    0x0662 01634 (main.go:21)   MOVQ    AX, ""..autotmp_12+336(SP)
431    0x066a 01642 (main.go:21)   MOVQ    CX, ""..autotmp_12+344(SP)
432    0x0672 01650 (main.go:21)   PCDATA  $0, $0
433    0x0672 01650 (main.go:21)   PCDATA  $1, $21
434    0x0672 01650 (main.go:21)   MOVQ    AX, "".v2+208(SP)
435    0x067a 01658 (main.go:21)   MOVQ    CX, "".v2+216(SP)
436    0x0682 01666 (main.go:21)   MOVBLZX ""..autotmp_13+55(SP), AX
437    0x0687 01671 (main.go:21)   MOVB    AL, "".ok+54(SP)
438    0x068b 01675 (main.go:21)   CMPB    "".ok+54(SP), $0
439    0x0690 01680 (main.go:21)   JNE 1687
440    0x0692 01682 (main.go:21)   JMP 1862
441    0x0697 01687 (main.go:22)   MOVQ    "".v2+216(SP), AX
442    0x069f 01695 (main.go:22)   PCDATA  $0, $5
443    0x069f 01695 (main.go:22)   PCDATA  $1, $0
444    0x069f 01695 (main.go:22)   MOVQ    "".v2+208(SP), CX
445    0x06a7 01703 (main.go:22)   PCDATA  $0, $0
446    0x06a7 01703 (main.go:22)   MOVQ    CX, (SP)
447    0x06ab 01707 (main.go:22)   MOVQ    AX, 8(SP)
448    0x06b0 01712 (main.go:22)   CALL    runtime.convTstring(SB)
449    0x06b5 01717 (main.go:22)   PCDATA  $0, $1
450    0x06b5 01717 (main.go:22)   MOVQ    16(SP), AX
451    0x06ba 01722 (main.go:22)   PCDATA  $0, $0
452    0x06ba 01722 (main.go:22)   PCDATA  $1, $22
453    0x06ba 01722 (main.go:22)   MOVQ    AX, ""..autotmp_36+96(SP)
454    0x06bf 01727 (main.go:22)   PCDATA  $1, $23
455    0x06bf 01727 (main.go:22)   XORPS   X0, X0
456    0x06c2 01730 (main.go:22)   MOVUPS  X0, ""..autotmp_9+272(SP)
457    0x06ca 01738 (main.go:22)   PCDATA  $0, $1
458    0x06ca 01738 (main.go:22)   PCDATA  $1, $22
459    0x06ca 01738 (main.go:22)   LEAQ    ""..autotmp_9+272(SP), AX
460    0x06d2 01746 (main.go:22)   MOVQ    AX, ""..autotmp_38+88(SP)
461    0x06d7 01751 (main.go:22)   TESTB   AL, (AX)
462    0x06d9 01753 (main.go:22)   PCDATA  $0, $2
463    0x06d9 01753 (main.go:22)   PCDATA  $1, $0
464    0x06d9 01753 (main.go:22)   MOVQ    ""..autotmp_36+96(SP), CX
465    0x06de 01758 (main.go:22)   PCDATA  $0, $3
466    0x06de 01758 (main.go:22)   LEAQ    type.string(SB), DX
467    0x06e5 01765 (main.go:22)   PCDATA  $0, $2
468    0x06e5 01765 (main.go:22)   MOVQ    DX, ""..autotmp_9+272(SP)
469    0x06ed 01773 (main.go:22)   PCDATA  $0, $1
470    0x06ed 01773 (main.go:22)   MOVQ    CX, ""..autotmp_9+280(SP)
471    0x06f5 01781 (main.go:22)   TESTB   AL, (AX)
472    0x06f7 01783 (main.go:22)   JMP 1785
473    0x06f9 01785 (main.go:22)   MOVQ    AX, ""..autotmp_37+352(SP)
474    0x0701 01793 (main.go:22)   MOVQ    $1, ""..autotmp_37+360(SP)
475    0x070d 01805 (main.go:22)   MOVQ    $1, ""..autotmp_37+368(SP)
476    0x0719 01817 (main.go:22)   PCDATA  $0, $0
477    0x0719 01817 (main.go:22)   MOVQ    AX, (SP)
478    0x071d 01821 (main.go:22)   MOVQ    $1, 8(SP)
479    0x0726 01830 (main.go:22)   MOVQ    $1, 16(SP)
480    0x072f 01839 (main.go:22)   CALL    fmt.Println(SB)
481    0x0734 01844 (main.go:22)   JMP 1846
482    0x0736 01846 ()    PCDATA  $0, $-1 483    0x0736 01846 ()    PCDATA  $1, $-1 484    0x0736 01846 ()    MOVQ    640(SP), BP 485    0x073e 01854 ()    ADDQ    $648, SP 486    0x0745 01861 ()    RET 487    0x0746 01862 (main.go:21)   JMP 1846 488    0x0748 01864 (main.go:14)   PCDATA  $0, $-2 489    0x0748 01864 (main.go:14)   PCDATA  $1, $-2 490    0x0748 01864 (main.go:14)   LEAQ    go.string."2"(SB), AX 491    0x074f 01871 (main.go:14)   CALL    runtime.gcWriteBarrier(SB) 492    0x0754 01876 (main.go:14)   JMP 768 493    0x0759 01881 (main.go:14)   NOP 494    0x0759 01881 (main.go:5)    PCDATA  $1, $-1 495    0x0759 01881 (main.go:5)    PCDATA  $0, $-2 496    0x0759 01881 (main.go:5)    CALL    runtime.morestack_noctxt(SB) 497    0x075e 01886 (main.go:5)    PCDATA  $0, $-1 498    0x075e 01886 (main.go:5)    JMP 0 499    0x0000 65 48 8b 0c 25 28 00 00 00 48 8b 89 00 00 00 00  eH..%(...H...... 500    0x0010 48 8d 84 24 f8 fd ff ff 48 3b 41 10 0f 86 37 07  H..$....H;A...7. 501    0x0020 00 00 48 81 ec 88 02 00 00 48 89 ac 24 80 02 00  ..H......H..$... 502    0x0030 00 48 8d ac 24 80 02 00 00 e8 00 00 00 00 48 8b  .H..$.........H. 503    0x0040 04 24 48 89 44 24 50 48 89 84 24 c8 00 00 00 0f  .$H.D$PH..$..... 504    0x0050 57 c0 0f 11 84 24 10 01 00 00 48 8d 84 24 10 01  W....$....H..$.. 505    0x0060 00 00 48 89 84 24 c0 00 00 00 84 00 48 8b 8c 24  ..H..$......H..$ 506    0x0070 c8 00 00 00 48 8d 15 00 00 00 00 48 89 94 24 10  ....H......H..$. 507    0x0080 01 00 00 48 89 8c 24 18 01 00 00 84 00 eb 00 48  ...H..$........H 508    0x0090 89 84 24 08 02 00 00 48 c7 84 24 10 02 00 00 01  ..$....H..$..... 509    0x00a0 00 00 00 48 c7 84 24 18 02 00 00 01 00 00 00 48  ...H..$........H 510    0x00b0 89 04 24 48 c7 44 24 08 01 00 00 00 48 c7 44 24  ..$H.D$.....H.D$ 511    0x00c0 10 01 00 00 00 e8 00 00 00 00 e8 00 00 00 00 48  ...............H 512    0x00d0 8b 04 24 48 89 44 24 48 48 89 84 24 c8 00 00 00  ..$H.D$HH..$.... 513    0x00e0 0f 57 c0 0f 11 84 24 10 01 00 00 48 8d 84 24 10  .W....$....H..$. 514    0x00f0 01 00 00 48 89 84 24 b8 00 00 00 84 00 48 8b 8c  ...H..$......H.. 515    0x0100 24 c8 00 00 00 48 8d 15 00 00 00 00 48 89 94 24  $....H......H..$ 516    0x0110 10 01 00 00 48 89 8c 24 18 01 00 00 84 00 eb 00  ....H..$........ 517    0x0120 48 89 84 24 f0 01 00 00 48 c7 84 24 f8 01 00 00  H..$....H..$.... 518    0x0130 01 00 00 00 48 c7 84 24 00 02 00 00 01 00 00 00  ....H..$........ 519    0x0140 48 89 04 24 48 c7 44 24 08 01 00 00 00 48 c7 44  H..$H.D$.....H.D 520    0x0150 24 10 01 00 00 00 e8 00 00 00 00 48 8d 05 00 00  $..........H.... 521    0x0160 00 00 48 89 04 24 48 c7 44 24 08 09 00 00 00 48  ..H..$H.D$.....H 522    0x0170 c7 44 24 10 00 00 00 00 e8 00 00 00 00 48 8b 44  .D$..........H.D 523    0x0180 24 18 48 89 44 24 40 48 89 84 24 c8 00 00 00 0f  $.H.D$@H..$..... 524    0x0190 57 c0 0f 11 84 24 10 01 00 00 48 8d 84 24 10 01  W....$....H..$.. 525    0x01a0 00 00 48 89 84 24 b0 00 00 00 84 00 48 8b 8c 24  ..H..$......H..$ 526    0x01b0 c8 00 00 00 48 8d 15 00 00 00 00 48 89 94 24 10  ....H......H..$. 527    0x01c0 01 00 00 48 89 8c 24 18 01 00 00 84 00 eb 00 48  ...H..$........H 528    0x01d0 89 84 24 d8 01 00 00 48 c7 84 24 e0 01 00 00 01  ..$....H..$..... 529    0x01e0 00 00 00 48 c7 84 24 e8 01 00 00 01 00 00 00 48  ...H..$........H 530    0x01f0 89 04 24 48 c7 44 24 08 01 00 00 00 48 c7 44 24  ..$H.D$.....H.D$ 531    0x0200 10 01 00 00 00 e8 00 00 00 00 e8 00 00 00 00 48  ...............H 532    0x0210 8b 04 24 48 89 44 24 38 48 8b 44 24 38 48 89 84  ..$H.D$8H.D$8H.. 533    0x0220 24 c8 00 00 00 0f 57 c0 0f 11 84 24 10 01 00 00  $.....W....$.... 534    0x0230 48 8d 84 24 10 01 00 00 48 89 84 24 a8 00 00 00  H..$....H..$.... 535    0x0240 84 00 48 8b 8c 24 c8 00 00 00 48 8d 15 00 00 00  ..H..$....H..... 536    0x0250 00 48 89 94 24 10 01 00 00 48 89 8c 24 18 01 00  .H..$....H..$... 537    0x0260 00 84 00 eb 00 48 89 84 24 c0 01 00 00 48 c7 84  .....H..$....H.. 538    0x0270 24 c8 01 00 00 01 00 00 00 48 c7 84 24 d0 01 00  $........H..$... 539    0x0280 00 01 00 00 00 48 89 04 24 48 c7 44 24 08 01 00  .....H..$H.D$... 540    0x0290 00 00 48 c7 44 24 10 01 00 00 00 e8 00 00 00 00  ..H.D$.......... 541    0x02a0 48 8d 05 00 00 00 00 48 89 04 24 48 8b 44 24 40  H......H..$H.D$@ 542    0x02b0 48 89 44 24 08 48 8d 05 00 00 00 00 48 89 44 24  H.D$.H......H.D$ 543    0x02c0 10 48 c7 44 24 18 01 00 00 00 e8 00 00 00 00 48  .H.D$..........H 544    0x02d0 8b 7c 24 20 48 89 bc 24 a0 00 00 00 84 07 48 c7  .|$ H..$......H. 545    0x02e0 47 08 01 00 00 00 83 3d 00 00 00 00 00 74 05 e9  G......=.....t.. 546    0x02f0 54 04 00 00 48 8d 05 00 00 00 00 48 89 07 eb 00  T...H......H.... 547    0x0300 48 8b 44 24 40 48 89 84 24 c8 00 00 00 48 8d bc  H.D$@H..$....H.. 548    0x0310 24 20 02 00 00 0f 57 c0 48 8d 7f e0 48 89 6c 24  $ ....W.H...H.l$ 549    0x0320 f0 48 8d 6c 24 f0 e8 00 00 00 00 48 8b 6d 00 48  .H.l$......H.m.H 550    0x0330 8d 05 00 00 00 00 48 89 04 24 48 8b 84 24 c8 00  ......H..$H..$.. 551    0x0340 00 00 48 89 44 24 08 48 8d 84 24 20 02 00 00 48  ..H.D$.H..$ ...H 552    0x0350 89 44 24 10 e8 00 00 00 00 eb 00 48 83 bc 24 20  .D$........H..$  553    0x0360 02 00 00 00 75 05 e9 c6 01 00 00 48 8b 84 24 28  ....u......H..$( 554    0x0370 02 00 00 84 00 48 8b 48 08 48 8b 00 48 89 84 24  .....H.H.H..H..$ 555    0x0380 20 01 00 00 48 89 8c 24 28 01 00 00 48 8b 84 24   ...H..$(...H..$ 556    0x0390 20 02 00 00 84 00 48 8b 48 08 48 8b 00 48 89 84   .....H.H.H..H.. 557    0x03a0 24 00 01 00 00 48 89 8c 24 08 01 00 00 48 8b 84  $....H..$....H.. 558    0x03b0 24 28 01 00 00 48 8b 8c 24 20 01 00 00 48 89 8c  $(...H..$ ...H.. 559    0x03c0 24 f0 00 00 00 48 89 84 24 f8 00 00 00 48 8b 84  $....H..$....H.. 560    0x03d0 24 08 01 00 00 48 8b 8c 24 00 01 00 00 48 89 0c  $....H..$....H.. 561    0x03e0 24 48 89 44 24 08 e8 00 00 00 00 48 8b 44 24 10  $H.D$......H.D$. 562    0x03f0 48 89 84 24 98 00 00 00 0f 57 c0 0f 11 84 24 10  H..$.....W....$. 563    0x0400 01 00 00 48 8d 84 24 10 01 00 00 48 89 84 24 90  ...H..$....H..$. 564    0x0410 00 00 00 84 00 48 8b 8c 24 98 00 00 00 48 8d 15  .....H..$....H.. 565    0x0420 00 00 00 00 48 89 94 24 10 01 00 00 48 89 8c 24  ....H..$....H..$ 566    0x0430 18 01 00 00 84 00 eb 00 48 89 84 24 a8 01 00 00  ........H..$.... 567    0x0440 48 c7 84 24 b0 01 00 00 01 00 00 00 48 c7 84 24  H..$........H..$ 568    0x0450 b8 01 00 00 01 00 00 00 48 89 04 24 48 c7 44 24  ........H..$H.D$ 569    0x0460 08 01 00 00 00 48 c7 44 24 10 01 00 00 00 e8 00  .....H.D$....... 570    0x0470 00 00 00 48 8b 84 24 f8 00 00 00 48 8b 8c 24 f0  ...H..$....H..$. 571    0x0480 00 00 00 48 89 0c 24 48 89 44 24 08 e8 00 00 00  ...H..$H.D$..... 572    0x0490 00 48 8b 44 24 10 48 89 84 24 88 00 00 00 0f 57  .H.D$.H..$.....W 573    0x04a0 c0 0f 11 84 24 10 01 00 00 48 8d 84 24 10 01 00  ....$....H..$... 574    0x04b0 00 48 89 84 24 80 00 00 00 84 00 48 8b 8c 24 88  .H..$......H..$. 575    0x04c0 00 00 00 48 8d 15 00 00 00 00 48 89 94 24 10 01  ...H......H..$.. 576    0x04d0 00 00 48 89 8c 24 18 01 00 00 84 00 eb 00 48 89  ..H..$........H. 577    0x04e0 84 24 90 01 00 00 48 c7 84 24 98 01 00 00 01 00  .$....H..$...... 578    0x04f0 00 00 48 c7 84 24 a0 01 00 00 01 00 00 00 48 89  ..H..$........H. 579    0x0500 04 24 48 c7 44 24 08 01 00 00 00 48 c7 44 24 10  .$H.D$.....H.D$. 580    0x0510 01 00 00 00 e8 00 00 00 00 eb 00 48 8d 84 24 20  ...........H..$  581    0x0520 02 00 00 48 89 04 24 e8 00 00 00 00 e9 2a fe ff  ...H..$......*.. 582    0x0530 ff 48 8d 05 00 00 00 00 48 89 04 24 48 8b 44 24  .H......H..$H.D$ 583    0x0540 40 48 89 44 24 08 48 8d 05 00 00 00 00 48 89 44  @H.D$.H......H.D 584    0x0550 24 10 48 c7 44 24 18 01 00 00 00 e8 00 00 00 00  $.H.D$.......... 585    0x0560 48 8b 44 24 20 48 8b 08 48 8b 40 08 48 89 8c 24  H.D$ H..H.@.H..$ 586    0x0570 e0 00 00 00 48 89 84 24 e8 00 00 00 48 89 0c 24  ....H..$....H..$ 587    0x0580 48 89 44 24 08 e8 00 00 00 00 48 8b 44 24 10 48  H.D$......H.D$.H 588    0x0590 89 44 24 78 0f 57 c0 0f 11 84 24 10 01 00 00 48  .D$x.W....$....H 589    0x05a0 8d 84 24 10 01 00 00 48 89 44 24 70 84 00 48 8b  ..$....H.D$p..H. 590    0x05b0 4c 24 78 48 8d 15 00 00 00 00 48 89 94 24 10 01  L$xH......H..$.. 591    0x05c0 00 00 48 89 8c 24 18 01 00 00 84 00 eb 00 48 89  ..H..$........H. 592    0x05d0 84 24 78 01 00 00 48 c7 84 24 80 01 00 00 01 00  .$x...H..$...... 593    0x05e0 00 00 48 c7 84 24 88 01 00 00 01 00 00 00 48 89  ..H..$........H. 594    0x05f0 04 24 48 c7 44 24 08 01 00 00 00 48 c7 44 24 10  .$H.D$.....H.D$. 595    0x0600 01 00 00 00 e8 00 00 00 00 0f 57 c0 0f 11 84 24  ..........W....$ 596    0x0610 50 01 00 00 48 8d 05 00 00 00 00 48 89 04 24 48  P...H......H..$H 597    0x0620 8b 44 24 40 48 89 44 24 08 48 8d 05 00 00 00 00  .D$@H.D$.H...... 598    0x0630 48 89 44 24 10 48 c7 44 24 18 01 00 00 00 e8 00  H.D$.H.D$....... 599    0x0640 00 00 00 48 8b 44 24 20 48 89 44 24 68 0f b6 44  ...H.D$ H.D$h..D 600    0x0650 24 28 88 44 24 37 48 8b 44 24 68 48 8b 48 08 48  $(.D$7H.D$hH.H.H 601    0x0660 8b 00 48 89 84 24 50 01 00 00 48 89 8c 24 58 01  ..H..$P...H..$X. 602    0x0670 00 00 48 89 84 24 d0 00 00 00 48 89 8c 24 d8 00  ..H..$....H..$.. 603    0x0680 00 00 0f b6 44 24 37 88 44 24 36 80 7c 24 36 00  ....D$7.D$6.|$6. 604    0x0690 75 05 e9 af 00 00 00 48 8b 84 24 d8 00 00 00 48  u......H..$....H 605    0x06a0 8b 8c 24 d0 00 00 00 48 89 0c 24 48 89 44 24 08  ..$....H..$H.D$. 606    0x06b0 e8 00 00 00 00 48 8b 44 24 10 48 89 44 24 60 0f  .....H.D$.H.D$`. 607    0x06c0 57 c0 0f 11 84 24 10 01 00 00 48 8d 84 24 10 01  W....$....H..$.. 608    0x06d0 00 00 48 89 44 24 58 84 00 48 8b 4c 24 60 48 8d  ..H.D$X..H.L$`H. 609    0x06e0 15 00 00 00 00 48 89 94 24 10 01 00 00 48 89 8c  .....H..$....H.. 610    0x06f0 24 18 01 00 00 84 00 eb 00 48 89 84 24 60 01 00  $........H..$`.. 611    0x0700 00 48 c7 84 24 68 01 00 00 01 00 00 00 48 c7 84  .H..$h.......H.. 612    0x0710 24 70 01 00 00 01 00 00 00 48 89 04 24 48 c7 44  $p.......H..$H.D 613    0x0720 24 08 01 00 00 00 48 c7 44 24 10 01 00 00 00 e8  $.....H.D$...... 614    0x0730 00 00 00 00 eb 00 48 8b ac 24 80 02 00 00 48 81  ......H..$....H. 615    0x0740 c4 88 02 00 00 c3 eb ee 48 8d 05 00 00 00 00 e8  ........H....... 616    0x0750 00 00 00 00 e9 a7 fb ff ff e8 00 00 00 00 e9 9d  ................ 617    0x0760 f8 ff ff                                         ... 618    rel 12+4 t=17 TLS+0 619    rel 58+4 t=8 runtime.makemap_small+0 620    rel 119+4 t=16 type.map[string]string+0 621    rel 198+4 t=8 fmt.Println+0 622    rel 203+4 t=8 runtime.makemap_small+0 623    rel 264+4 t=16 type.map[string]string+0 624    rel 343+4 t=8 fmt.Println+0 625    rel 350+4 t=16 type.map[string]string+0 626    rel 377+4 t=8 runtime.makemap+0 627    rel 439+4 t=16 type.map[string]string+0 628    rel 518+4 t=8 fmt.Println+0 629    rel 523+4 t=8 runtime.makemap_small+0 630    rel 589+4 t=16 type.map[string]string+0 631    rel 668+4 t=8 fmt.Println+0 632    rel 675+4 t=16 type.map[string]string+0 633    rel 696+4 t=16 go.string."1"+0 634    rel 715+4 t=8 runtime.mapassign_faststr+0 635    rel 744+4 t=16 runtime.writeBarrier+-1 636    rel 759+4 t=16 go.string."2"+0 637    rel 807+4 t=8 runtime.duffzero+273 638    rel 818+4 t=16 type.map[string]string+0 639    rel 853+4 t=8 runtime.mapiterinit+0 640    rel 999+4 t=8 runtime.convTstring+0 641    rel 1056+4 t=16 type.string+0 642    rel 1135+4 t=8 fmt.Println+0 643    rel 1165+4 t=8 runtime.convTstring+0 644    rel 1222+4 t=16 type.string+0 645    rel 1301+4 t=8 fmt.Println+0 646    rel 1320+4 t=8 runtime.mapiternext+0 647    rel 1332+4 t=16 type.map[string]string+0 648    rel 1353+4 t=16 go.string."1"+0 649    rel 1372+4 t=8 runtime.mapaccess1_faststr+0 650    rel 1414+4 t=8 runtime.convTstring+0 651    rel 1462+4 t=16 type.string+0 652    rel 1541+4 t=8 fmt.Println+0 653    rel 1559+4 t=16 type.map[string]string+0 654    rel 1580+4 t=16 go.string."1"+0 655    rel 1599+4 t=8 runtime.mapaccess2_faststr+0 656    rel 1713+4 t=8 runtime.convTstring+0 657    rel 1761+4 t=16 type.string+0 658    rel 1840+4 t=8 fmt.Println+0 659    rel 1867+4 t=16 go.string."2"+0 660    rel 1872+4 t=8 runtime.gcWriteBarrier+0 661    rel 1882+4 t=8 runtime.morestack_noctxt+0 662go.cuinfo.packagename. SDWARFINFO dupok size=0 663    0x0000 6d 61 69 6e                                      main 664go.string."1" SRODATA dupok size=1 665    0x0000 31                                               1 666go.string."2" SRODATA dupok size=1 667    0x0000 32                                               2 668go.loc."".main SDWARFLOC size=0 669go.info."".main SDWARFINFO size=172 670    0x0000 03 22 22 2e 6d 61 69 6e 00 00 00 00 00 00 00 00  ."".main........ 671    0x0010 00 00 00 00 00 00 00 00 00 01 9c 00 00 00 00 01  ................ 672    0x0020 0a 6d 34 00 0c 00 00 00 00 03 91 a8 7b 0a 6d 33  .m4.........{.m3 673    0x0030 00 0a 00 00 00 00 03 91 b0 7b 0a 6d 32 00 08 00  .........{.m2... 674    0x0040 00 00 00 03 91 b8 7b 0a 6d 31 00 06 00 00 00 00  ......{.m1...... 675    0x0050 03 91 c0 7b 0a 76 31 00 13 00 00 00 00 03 91 d0  ...{.v1......... 676    0x0060 7c 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |............... 677    0x0070 00 00 0a 76 00 0f 00 00 00 00 03 91 e0 7c 0a 6b  ...v.........|.k 678    0x0080 00 0f 00 00 00 00 03 91 f0 7c 00 14 00 00 00 00  .........|...... 679    0x0090 0a 6f 6b 00 15 00 00 00 00 03 91 a6 7b 0a 76 32  .ok.........{.v2 680    0x00a0 00 15 00 00 00 00 03 91 c0 7c 00 00              .........|.. 681    rel 0+0 t=24 type.*[1]interface {}+0 682    rel 0+0 t=24 type.*string+0 683    rel 0+0 t=24 type.[1]interface {}+0 684    rel 0+0 t=24 type.[]interface {}+0 685    rel 0+0 t=24 type.bool+0 686    rel 0+0 t=24 type.map[string]string+0 687    rel 0+0 t=24 type.noalg.map.iter[string]string+0 688    rel 0+0 t=24 type.string+0 689    rel 0+0 t=24 type.unsafe.Pointer+0 690    rel 9+8 t=1 "".main+0 691    rel 17+8 t=1 "".main+1891 692    rel 27+4 t=30 gofile..D:\software_installed\gopath\src\leetcode\editor\cn\main.go+0 693    rel 37+4 t=29 go.info.map[string]string+0 694    rel 50+4 t=29 go.info.map[string]string+0 695    rel 63+4 t=29 go.info.map[string]string+0 696    rel 76+4 t=29 go.info.map[string]string+0 697    rel 89+4 t=29 go.info.string+0 698    rel 98+8 t=1 "".main+768 699    rel 106+8 t=1 "".main+1329 700    rel 118+4 t=29 go.info.string+0 701    rel 130+4 t=29 go.info.string+0 702    rel 140+4 t=29 go.range."".main+0 703    rel 149+4 t=29 go.info.bool+0 704    rel 162+4 t=29 go.info.string+0 705go.range."".main SDWARFRANGE size=64 706    0x0000 ff ff ff ff ff ff ff ff 00 00 00 00 00 00 00 00  ................ 707    0x0010 09 06 00 00 00 00 00 00 36 07 00 00 00 00 00 00  ........6....... 708    0x0020 46 07 00 00 00 00 00 00 48 07 00 00 00 00 00 00  F.......H....... 709    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 710    rel 8+8 t=1 "".main+0 711go.debuglines."".main SDWARFMISC size=136 712    0x0000 04 02 13 0a 08 73 f6 06 41 06 6a 06 5f 06 02 64  .....s..A.j._..d 713    0x0010 f6 06 41 06 6a 06 5f 06 02 64 f6 06 55 06 eb 06  ..A.j._..d..U... 714    0x0020 41 06 74 06 5f 06 02 64 f6 06 41 06 6a 06 41 06  A.t._..d..A.j.A. 715    0x0030 02 6c f6 06 55 06 02 42 f6 06 41 06 02 3e ff 06  .l..U..B..A..>.. 716    0x0040 69 06 02 52 f6 06 5f 06 b9 06 41 06 02 71 f6 06  i..R.._...A..q.. 717    0x0050 5f 06 b9 06 41 06 02 72 fd 06 5f 06 37 06 41 06  _...A..r.._.7.A. 718    0x0060 45 06 55 06 02 2d f6 06 37 06 02 72 f6 06 2d 06  E.U..-..7..r..-. 719    0x0070 02 74 f6 06 5f 06 b9 06 41 02 79 fe 03 7d 1f 06  .t.._...A.y..}.. 720    0x0080 03 7b b5 04 01 03 7c 01                          .{....|. 721runtime.nilinterequal·f SRODATA dupok size=8 722    0x0000 00 00 00 00 00 00 00 00                          ........ 723    rel 0+8 t=1 runtime.nilinterequal+0 724runtime.memequal64·f SRODATA dupok size=8 725    0x0000 00 00 00 00 00 00 00 00                          ........ 726    rel 0+8 t=1 runtime.memequal64+0 727runtime.gcbits.01 SRODATA dupok size=1 728    0x0000 01                                               . 729type..namedata.*interface {}- SRODATA dupok size=16 730    0x0000 00 00 0d 2a 69 6e 74 65 72 66 61 63 65 20 7b 7d  ...*interface {} 731type.*interface {} SRODATA dupok size=56 732    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 733    0x0010 4f 0f 96 9d 08 08 08 36 00 00 00 00 00 00 00 00  O......6........ 734    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 735    0x0030 00 00 00 00 00 00 00 00                          ........ 736    rel 24+8 t=1 runtime.memequal64·f+0 737    rel 32+8 t=1 runtime.gcbits.01+0 738    rel 40+4 t=5 type..namedata.*interface {}-+0 739    rel 48+8 t=1 type.interface {}+0 740runtime.gcbits.02 SRODATA dupok size=1 741    0x0000 02                                               . 742type.interface {} SRODATA dupok size=80 743    0x0000 10 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................ 744    0x0010 e7 57 a0 18 02 08 08 14 00 00 00 00 00 00 00 00  .W.............. 745    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 746    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 747    0x0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 748    rel 24+8 t=1 runtime.nilinterequal·f+0 749    rel 32+8 t=1 runtime.gcbits.02+0 750    rel 40+4 t=5 type..namedata.*interface {}-+0 751    rel 44+4 t=6 type.*interface {}+0 752    rel 56+8 t=1 type.interface {}+80 753type..namedata.*[]interface {}- SRODATA dupok size=18 754    0x0000 00 00 0f 2a 5b 5d 69 6e 74 65 72 66 61 63 65 20  ...*[]interface  755    0x0010 7b 7d                                            {} 756type.*[]interface {} SRODATA dupok size=56 757    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 758    0x0010 f3 04 9a e7 08 08 08 36 00 00 00 00 00 00 00 00  .......6........ 759    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 760    0x0030 00 00 00 00 00 00 00 00                          ........ 761    rel 24+8 t=1 runtime.memequal64·f+0 762    rel 32+8 t=1 runtime.gcbits.01+0 763    rel 40+4 t=5 type..namedata.*[]interface {}-+0 764    rel 48+8 t=1 type.[]interface {}+0 765type.[]interface {} SRODATA dupok size=56 766    0x0000 18 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 767    0x0010 70 93 ea 2f 02 08 08 17 00 00 00 00 00 00 00 00  p../............ 768    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 769    0x0030 00 00 00 00 00 00 00 00                          ........ 770    rel 32+8 t=1 runtime.gcbits.01+0 771    rel 40+4 t=5 type..namedata.*[]interface {}-+0 772    rel 44+4 t=6 type.*[]interface {}+0 773    rel 48+8 t=1 type.interface {}+0 774type..namedata.*[1]interface {}- SRODATA dupok size=19 775    0x0000 00 00 10 2a 5b 31 5d 69 6e 74 65 72 66 61 63 65  ...*[1]interface 776    0x0010 20 7b 7d                                          {} 777type.*[1]interface {} SRODATA dupok size=56 778    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 779    0x0010 bf 03 a8 35 08 08 08 36 00 00 00 00 00 00 00 00  ...5...6........ 780    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 781    0x0030 00 00 00 00 00 00 00 00                          ........ 782    rel 24+8 t=1 runtime.memequal64·f+0 783    rel 32+8 t=1 runtime.gcbits.01+0 784    rel 40+4 t=5 type..namedata.*[1]interface {}-+0 785    rel 48+8 t=1 type.[1]interface {}+0 786type.[1]interface {} SRODATA dupok size=72 787    0x0000 10 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................ 788    0x0010 50 91 5b fa 02 08 08 11 00 00 00 00 00 00 00 00  P.[............. 789    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 790    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 791    0x0040 01 00 00 00 00 00 00 00                          ........ 792    rel 24+8 t=1 runtime.nilinterequal·f+0 793    rel 32+8 t=1 runtime.gcbits.02+0 794    rel 40+4 t=5 type..namedata.*[1]interface {}-+0 795    rel 44+4 t=6 type.*[1]interface {}+0 796    rel 48+8 t=1 type.interface {}+0 797    rel 56+8 t=1 type.[]interface {}+0 798type..namedata.*[]uint8- SRODATA dupok size=11 799    0x0000 00 00 08 2a 5b 5d 75 69 6e 74 38                 ...*[]uint8 800type.*[]uint8 SRODATA dupok size=56 801    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 802    0x0010 a5 8e d0 69 08 08 08 36 00 00 00 00 00 00 00 00  ...i...6........ 803    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 804    0x0030 00 00 00 00 00 00 00 00                          ........ 805    rel 24+8 t=1 runtime.memequal64·f+0 806    rel 32+8 t=1 runtime.gcbits.01+0 807    rel 40+4 t=5 type..namedata.*[]uint8-+0 808    rel 48+8 t=1 type.[]uint8+0 809type.[]uint8 SRODATA dupok size=56 810    0x0000 18 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 811    0x0010 df 7e 2e 38 02 08 08 17 00 00 00 00 00 00 00 00  .~.8............ 812    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 813    0x0030 00 00 00 00 00 00 00 00                          ........ 814    rel 32+8 t=1 runtime.gcbits.01+0 815    rel 40+4 t=5 type..namedata.*[]uint8-+0 816    rel 44+4 t=6 type.*[]uint8+0 817    rel 48+8 t=1 type.uint8+0 818type..namedata.*[8]uint8- SRODATA dupok size=12 819    0x0000 00 00 09 2a 5b 38 5d 75 69 6e 74 38              ...*[8]uint8 820type.*[8]uint8 SRODATA dupok size=56 821    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 822    0x0010 a9 89 a5 7a 08 08 08 36 00 00 00 00 00 00 00 00  ...z...6........ 823    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 824    0x0030 00 00 00 00 00 00 00 00                          ........ 825    rel 24+8 t=1 runtime.memequal64·f+0 826    rel 32+8 t=1 runtime.gcbits.01+0 827    rel 40+4 t=5 type..namedata.*[8]uint8-+0 828    rel 48+8 t=1 type.[8]uint8+0 829runtime.gcbits. SRODATA dupok size=0 830type.[8]uint8 SRODATA dupok size=72 831    0x0000 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 832    0x0010 3e f9 30 b4 0a 01 01 11 00 00 00 00 00 00 00 00  >.0............. 833    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 834    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 835    0x0040 08 00 00 00 00 00 00 00                          ........ 836    rel 24+8 t=1 runtime.memequal64·f+0 837    rel 32+8 t=1 runtime.gcbits.+0 838    rel 40+4 t=5 type..namedata.*[8]uint8-+0 839    rel 44+4 t=6 type.*[8]uint8+0 840    rel 48+8 t=1 type.uint8+0 841    rel 56+8 t=1 type.[]uint8+0 842type..namedata.*[]string- SRODATA dupok size=12 843    0x0000 00 00 09 2a 5b 5d 73 74 72 69 6e 67              ...*[]string 844type.*[]string SRODATA dupok size=56 845    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 846    0x0010 92 22 76 84 08 08 08 36 00 00 00 00 00 00 00 00  ."v....6........ 847    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 848    0x0030 00 00 00 00 00 00 00 00                          ........ 849    rel 24+8 t=1 runtime.memequal64·f+0 850    rel 32+8 t=1 runtime.gcbits.01+0 851    rel 40+4 t=5 type..namedata.*[]string-+0 852    rel 48+8 t=1 type.[]string+0 853type.[]string SRODATA dupok size=56 854    0x0000 18 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 855    0x0010 d3 a8 f3 0a 02 08 08 17 00 00 00 00 00 00 00 00  ................ 856    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 857    0x0030 00 00 00 00 00 00 00 00                          ........ 858    rel 32+8 t=1 runtime.gcbits.01+0 859    rel 40+4 t=5 type..namedata.*[]string-+0 860    rel 44+4 t=6 type.*[]string+0 861    rel 48+8 t=1 type.string+0 862type..namedata.*[8]string- SRODATA dupok size=13 863    0x0000 00 00 0a 2a 5b 38 5d 73 74 72 69 6e 67           ...*[8]string 864type.*[8]string SRODATA dupok size=56 865    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 866    0x0010 ad 94 14 6f 08 08 08 36 00 00 00 00 00 00 00 00  ...o...6........ 867    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 868    0x0030 00 00 00 00 00 00 00 00                          ........ 869    rel 24+8 t=1 runtime.memequal64·f+0 870    rel 32+8 t=1 runtime.gcbits.01+0 871    rel 40+4 t=5 type..namedata.*[8]string-+0 872    rel 48+8 t=1 type.noalg.[8]string+0 873runtime.gcbits.5555 SRODATA dupok size=2 874    0x0000 55 55                                            UU 875type.noalg.[8]string SRODATA dupok size=72 876    0x0000 80 00 00 00 00 00 00 00 78 00 00 00 00 00 00 00  ........x....... 877    0x0010 55 53 8c 3e 02 08 08 11 00 00 00 00 00 00 00 00  US.>............ 878    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 879    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 880    0x0040 08 00 00 00 00 00 00 00                          ........ 881    rel 32+8 t=1 runtime.gcbits.5555+0 882    rel 40+4 t=5 type..namedata.*[8]string-+0 883    rel 44+4 t=6 type.*[8]string+0 884    rel 48+8 t=1 type.string+0 885    rel 56+8 t=1 type.[]string+0 886runtime.gcbits.aaaaaaaa02 SRODATA dupok size=5 887    0x0000 aa aa aa aa 02                                   ..... 888type..namedata.*map.bucket[string]string- SRODATA dupok size=28 889    0x0000 00 00 19 2a 6d 61 70 2e 62 75 63 6b 65 74 5b 73  ...*map.bucket[s 890    0x0010 74 72 69 6e 67 5d 73 74 72 69 6e 67              tring]string 891type..importpath.. SRODATA dupok size=3 892    0x0000 00 00 00                                         ... 893type..namedata.topbits- SRODATA dupok size=10 894    0x0000 00 00 07 74 6f 70 62 69 74 73                    ...topbits 895type..namedata.keys- SRODATA dupok size=7 896    0x0000 00 00 04 6b 65 79 73                             ...keys 897type..namedata.elems- SRODATA dupok size=8 898    0x0000 00 00 05 65 6c 65 6d 73                          ...elems 899type..namedata.overflow- SRODATA dupok size=11 900    0x0000 00 00 08 6f 76 65 72 66 6c 6f 77                 ...overflow 901type.noalg.map.bucket[string]string SRODATA dupok size=176 902    0x0000 10 01 00 00 00 00 00 00 10 01 00 00 00 00 00 00  ................ 903    0x0010 de 17 3e 1a 02 08 08 19 00 00 00 00 00 00 00 00  ..>............. 904    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 905    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 906    0x0040 04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  ................ 907    0x0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 908    0x0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 909    0x0070 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................ 910    0x0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 911    0x0090 10 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 912    0x00a0 00 00 00 00 00 00 00 00 10 02 00 00 00 00 00 00  ................ 913    rel 32+8 t=1 runtime.gcbits.aaaaaaaa02+0 914    rel 40+4 t=5 type..namedata.*map.bucket[string]string-+0 915    rel 44+4 t=6 type.*map.bucket[string]string+0 916    rel 48+8 t=1 type..importpath..+0 917    rel 56+8 t=1 type.noalg.map.bucket[string]string+80 918    rel 80+8 t=1 type..namedata.topbits-+0 919    rel 88+8 t=1 type.[8]uint8+0 920    rel 104+8 t=1 type..namedata.keys-+0 921    rel 112+8 t=1 type.noalg.[8]string+0 922    rel 128+8 t=1 type..namedata.elems-+0 923    rel 136+8 t=1 type.noalg.[8]string+0 924    rel 152+8 t=1 type..namedata.overflow-+0 925    rel 160+8 t=1 type.*map.bucket[string]string+0 926type.*map.bucket[string]string SRODATA dupok size=56 927    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................ 928    0x0010 a6 74 14 65 08 08 08 36 00 00 00 00 00 00 00 00  .t.e...6........ 929    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 930    0x0030 00 00 00 00 00 00 00 00                          ........ 931    rel 24+8 t=1 runtime.memequal64·f+0 932    rel 32+8 t=1 runtime.gcbits.01+0 933    rel 40+4 t=5 type..namedata.*map.bucket[string]string-+0 934    rel 48+8 t=1 type.noalg.map.bucket[string]string+0 935runtime.gcbits.2c SRODATA dupok size=1 936    0x0000 2c                                               , 937type..namedata.*map.hdr[string]string- SRODATA dupok size=25 938    0x0000 00 00 16 2a 6d 61 70 2e 68 64 72 5b 73 74 72 69  ...*map.hdr[stri 939    0x0010 6e 67 5d 73 74 72 69 6e 67                       ng]string 940type..namedata.count- SRODATA dupok size=8 941    0x0000 00 00 05 63 6f 75 6e 74                          ...count 942type..namedata.flags- SRODATA dupok size=8 943    0x0000 00 00 05 66 6c 61 67 73                          ...flags 944type..namedata.B. SRODATA dupok size=4 945    0x0000 01 00 01 42                                      ...B 946type..namedata.noverflow- SRODATA dupok size=12 947    0x0000 00 00 09 6e 6f 76 65 72 66 6c 6f 77              ...noverflow 948type..namedata.hash0- SRODATA dupok size=8 949    0x0000 00 00 05 68 61 73 68 30                          ...hash0 950type..namedata.buckets- SRODATA dupok size=10 951    0x0000 00 00 07 62 75 63 6b 65 74 73                    ...buckets 952type..namedata.oldbuckets- SRODATA dupok size=13 953    0x0000 00 00 0a 6f 6c 64 62 75 63 6b 65 74 73           ...oldbuckets 954type..namedata.nevacuate- SRODATA dupok size=12 955    0x0000 00 00 09 6e 65 76 61 63 75 61 74 65              ...nevacuate 956type..namedata.extra- SRODATA dupok size=8 957    0x0000 00 00 05 65 78 74 72 61                          ...extra 958type.noalg.map.hdr[string]string SRODATA dupok size=296 959    0x0000 30 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00  0.......0....... 960    0x0010 cf 6d 6c 68 02 08 08 19 00 00 00 00 00 00 00 00  .mlh............ 961    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 962    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 963    0x0040 09 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00  ................ 964    0x0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 965    0x0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 966    0x0070 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................ 967    0x0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 968    0x0090 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 969    0x00a0 00 00 00 00 00 00 00 00 14 00 00 00 00 00 00 00  ................ 970    0x00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 971    0x00c0 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 972    0x00d0 00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00  ........ ....... 973    0x00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 974    0x00f0 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  0............... 975    0x0100 00 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  ........@....... 976    0x0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................ 977    0x0120 50 00 00 00 00 00 00 00                          P....... 978    rel 32+8 t=1 runtime.gcbits.2c+0 979    rel 40+4 t=5 type..namedata.*map.hdr[string]string-+0 980    rel 44+4 t=6 type.*map.hdr[string]string+0 981    rel 48+8 t=1 type..importpath..+0 982    rel 56+8 t=1 type.noalg.map.hdr[string]string+80 983    rel 80+8 t=1 type..namedata.count-+0 984    rel 88+8 t=1 type.int+0 985    rel 104+8 t=1 type..namedata.flags-+0 986    rel 112+8 t=1 type.uint8+0 987    rel 128+8 t=1 type..namedata.B.+0 988    rel 136+8 t=1 type.uint8+0 989    rel 152+8 t=1 type..namedata.noverflow-+0 990    rel 160+8 t=1 type.uint16+0 991    rel 176+8 t=1 type..namedata.hash0-+0 992    rel 184+8 t=1 type.uint32+0 993    rel 200+8 t=1 type..namedata.buckets-+0 994    rel 208+8 t=1 type.*map.bucket[string]string+0 995    rel 224+8 t=1 type..namedata.oldbuckets-+0 996    rel 232+8 t=1 type.*map.bucket[string]string+0 997    rel 248+8 t=1 type..namedata.nevacuate-+0 998    rel 256+8 t=1 type.uintptr+0 999    rel 272+8 t=1 type..namedata.extra-+01000    rel 280+8 t=1 type.unsafe.Pointer+01001type.*map.hdr[string]string SRODATA dupok size=561002    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................1003    0x0010 81 ba c6 bc 08 08 08 36 00 00 00 00 00 00 00 00  .......6........1004    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1005    0x0030 00 00 00 00 00 00 00 00                          ........1006    rel 24+8 t=1 runtime.memequal64·f+01007    rel 32+8 t=1 runtime.gcbits.01+01008    rel 40+4 t=5 type..namedata.*map.hdr[string]string-+01009    rel 48+8 t=1 type.noalg.map.hdr[string]string+01010type..namedata.*map.iter[string]string- SRODATA dupok size=261011    0x0000 00 00 17 2a 6d 61 70 2e 69 74 65 72 5b 73 74 72  ...*map.iter[str1012    0x0010 69 6e 67 5d 73 74 72 69 6e 67                    ing]string1013type.*map.iter[string]string SRODATA dupok size=561014    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................1015    0x0010 13 f1 47 14 08 08 08 36 00 00 00 00 00 00 00 00  ..G....6........1016    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1017    0x0030 00 00 00 00 00 00 00 00                          ........1018    rel 24+8 t=1 runtime.memequal64·f+01019    rel 32+8 t=1 runtime.gcbits.01+01020    rel 40+4 t=5 type..namedata.*map.iter[string]string-+01021    rel 48+8 t=1 type.noalg.map.iter[string]string+01022runtime.gcbits.ff SRODATA dupok size=11023    0x0000 ff                                               .1024type..namedata.key- SRODATA dupok size=61025    0x0000 00 00 03 6b 65 79                                ...key1026type..namedata.elem- SRODATA dupok size=71027    0x0000 00 00 04 65 6c 65 6d                             ...elem1028type..namedata.t- SRODATA dupok size=41029    0x0000 00 00 01 74                                      ...t1030type..namedata.h- SRODATA dupok size=41031    0x0000 00 00 01 68                                      ...h1032type..namedata.bptr- SRODATA dupok size=71033    0x0000 00 00 04 62 70 74 72                             ...bptr1034type..namedata.oldoverflow- SRODATA dupok size=141035    0x0000 00 00 0b 6f 6c 64 6f 76 65 72 66 6c 6f 77        ...oldoverflow1036type..namedata.startBucket- SRODATA dupok size=141037    0x0000 00 00 0b 73 74 61 72 74 42 75 63 6b 65 74        ...startBucket1038type..namedata.offset- SRODATA dupok size=91039    0x0000 00 00 06 6f 66 66 73 65 74                       ...offset1040type..namedata.wrapped- SRODATA dupok size=101041    0x0000 00 00 07 77 72 61 70 70 65 64                    ...wrapped1042type..namedata.i- SRODATA dupok size=41043    0x0000 00 00 01 69                                      ...i1044type..namedata.bucket- SRODATA dupok size=91045    0x0000 00 00 06 62 75 63 6b 65 74                       ...bucket1046type..namedata.checkBucket- SRODATA dupok size=141047    0x0000 00 00 0b 63 68 65 63 6b 42 75 63 6b 65 74        ...checkBucket1048type.noalg.map.iter[string]string SRODATA dupok size=4401049    0x0000 60 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00  `.......@.......1050    0x0010 b9 85 5c 12 02 08 08 19 00 00 00 00 00 00 00 00  ..\.............1051    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1052    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1053    0x0040 0f 00 00 00 00 00 00 00 0f 00 00 00 00 00 00 00  ................1054    0x0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1055    0x0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1056    0x0070 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................1057    0x0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1058    0x0090 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ...............1059    0x00a0 00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00  ........0.......1060    0x00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1061    0x00c0 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  @...............1062    0x00d0 00 00 00 00 00 00 00 00 50 00 00 00 00 00 00 00  ........P.......1063    0x00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1064    0x00f0 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  `...............1065    0x0100 00 00 00 00 00 00 00 00 70 00 00 00 00 00 00 00  ........p.......1066    0x0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1067    0x0120 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1068    0x0130 00 00 00 00 00 00 00 00 90 00 00 00 00 00 00 00  ................1069    0x0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1070    0x0150 92 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1071    0x0160 00 00 00 00 00 00 00 00 94 00 00 00 00 00 00 00  ................1072    0x0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1073    0x0180 96 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1074    0x0190 00 00 00 00 00 00 00 00 a0 00 00 00 00 00 00 00  ................1075    0x01a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1076    0x01b0 b0 00 00 00 00 00 00 00                          ........1077    rel 32+8 t=1 runtime.gcbits.ff+01078    rel 40+4 t=5 type..namedata.*map.iter[string]string-+01079    rel 44+4 t=6 type.*map.iter[string]string+01080    rel 48+8 t=1 type..importpath..+01081    rel 56+8 t=1 type.noalg.map.iter[string]string+801082    rel 80+8 t=1 type..namedata.key-+01083    rel 88+8 t=1 type.*string+01084    rel 104+8 t=1 type..namedata.elem-+01085    rel 112+8 t=1 type.*string+01086    rel 128+8 t=1 type..namedata.t-+01087    rel 136+8 t=1 type.unsafe.Pointer+01088    rel 152+8 t=1 type..namedata.h-+01089    rel 160+8 t=1 type.*map.hdr[string]string+01090    rel 176+8 t=1 type..namedata.buckets-+01091    rel 184+8 t=1 type.*map.bucket[string]string+01092    rel 200+8 t=1 type..namedata.bptr-+01093    rel 208+8 t=1 type.*map.bucket[string]string+01094    rel 224+8 t=1 type..namedata.overflow-+01095    rel 232+8 t=1 type.unsafe.Pointer+01096    rel 248+8 t=1 type..namedata.oldoverflow-+01097    rel 256+8 t=1 type.unsafe.Pointer+01098    rel 272+8 t=1 type..namedata.startBucket-+01099    rel 280+8 t=1 type.uintptr+01100    rel 296+8 t=1 type..namedata.offset-+01101    rel 304+8 t=1 type.uint8+01102    rel 320+8 t=1 type..namedata.wrapped-+01103    rel 328+8 t=1 type.bool+01104    rel 344+8 t=1 type..namedata.B.+01105    rel 352+8 t=1 type.uint8+01106    rel 368+8 t=1 type..namedata.i-+01107    rel 376+8 t=1 type.uint8+01108    rel 392+8 t=1 type..namedata.bucket-+01109    rel 400+8 t=1 type.uintptr+01110    rel 416+8 t=1 type..namedata.checkBucket-+01111    rel 424+8 t=1 type.uintptr+01112""..inittask SNOPTRDATA size=321113    0x0000 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  ................1114    0x0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1115    rel 24+8 t=1 fmt..inittask+01116runtime.strhash·f SRODATA dupok size=81117    0x0000 00 00 00 00 00 00 00 00                          ........1118    rel 0+8 t=1 runtime.strhash+01119type..namedata.*map[string]string- SRODATA dupok size=211120    0x0000 00 00 12 2a 6d 61 70 5b 73 74 72 69 6e 67 5d 73  ...*map[string]s1121    0x0010 74 72 69 6e 67                                   tring1122type.*map[string]string SRODATA dupok size=561123    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................1124    0x0010 73 20 6b d9 08 08 08 36 00 00 00 00 00 00 00 00  s k....6........1125    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1126    0x0030 00 00 00 00 00 00 00 00                          ........1127    rel 24+8 t=1 runtime.memequal64·f+01128    rel 32+8 t=1 runtime.gcbits.01+01129    rel 40+4 t=5 type..namedata.*map[string]string-+01130    rel 48+8 t=1 type.map[string]string+01131type.map[string]string SRODATA dupok size=881132    0x0000 08 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00  ................1133    0x0010 59 a1 e7 29 02 08 08 35 00 00 00 00 00 00 00 00  Y..)...5........1134    0x0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1135    0x0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1136    0x0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................1137    0x0050 10 10 10 01 0c 00 00 00                          ........1138    rel 32+8 t=1 runtime.gcbits.01+01139    rel 40+4 t=5 type..namedata.*map[string]string-+01140    rel 44+4 t=6 type.*map[string]string+01141    rel 48+8 t=1 type.string+01142    rel 56+8 t=1 type.string+01143    rel 64+8 t=1 type.noalg.map.bucket[string]string+01144    rel 72+8 t=1 runtime.strhash·f+01145type..importpath.fmt. SRODATA dupok size=61146    0x0000 00 00 03 66 6d 74                                ...fmt1147gclocals·ad6397d3d33bbb6a31b1320349e23274 SRODATA dupok size=81148    0x0000 18 00 00 00 00 00 00 00                          ........1149gclocals·1bbf1965a34fa71a63e073b1cf2d752a SRODATA dupok size=2481150    0x0000 18 00 00 00 49 00 00 00 00 00 00 00 00 00 00 00  ....I...........1151    0x0010 00 00 00 00 04 00 00 00 00 00 00 00 00 00 04 10  ................1152    0x0020 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00  ................1153    0x0030 02 00 04 00 00 00 00 00 00 00 02 00 04 10 00 00  ................1154    0x0040 00 00 00 00 03 00 00 00 00 00 00 00 00 00 02 00  ................1155    0x0050 04 00 00 00 00 e0 1f 00 02 00 00 00 00 00 00 e0  ................1156    0x0060 1f 00 02 00 00 20 00 00 00 e0 1f 00 02 00 00 22  ..... ........."1157    0x0070 00 00 00 e0 1f 00 02 00 00 02 00 00 00 e0 1f 00  ................1158    0x0080 02 00 80 02 00 00 00 e0 1f 00 02 00 80 00 00 00  ................1159    0x0090 00 e0 1f 00 02 10 80 00 00 00 00 e0 1f 00 02 10  ................1160    0x00a0 80 10 00 00 00 e0 1f 00 02 04 00 00 00 00 00 e0  ................1161    0x00b0 1f 00 02 04 00 10 00 00 00 e0 1f 00 02 01 00 00  ................1162    0x00c0 00 00 00 00 00 00 02 01 00 10 00 00 00 00 00 00  ................1163    0x00d0 40 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00  @...............1164    0x00e0 00 00 00 00 20 00 00 00 00 00 00 00 00 00 20 00  .... ......... .1165    0x00f0 00 10 00 00 00 00 00 00                          ........1166gclocals·658035074399f748be6dd39603d5113c SRODATA dupok size=141167    0x0000 06 00 00 00 07 00 00 00 00 01 03 07 40 02        ............@.1168"".main.stkobj SRODATA size=401169    0x0000 02 00 00 00 00 00 00 00 90 fe ff ff ff ff ff ff  ................1170    0x0010 00 00 00 00 00 00 00 00 a0 ff ff ff ff ff ff ff  ................1171    0x0020 00 00 00 00 00 00 00 00                          ........1172    rel 16+8 t=1 type.[1]interface {}+01173    rel 32+8 t=1 type.noalg.map.iter[string]string+01174

东西有点多,但是我们只分析几个重点

  • main.go的第6行、第8行和第12行的map申明分别对应着main.txt23行、57行和132行,都是调用的runtime.makemap_small方法

  • main.go的第10行对应着main.txt的97行runtime.makemap方法

  • main.go的第14行的赋值对应着main.txt的184行runtime.mapassign_faststr方法

  • main.go的第15行的循环对应着main.txt第224行的runtime.mapiterinit方法初始化得到迭代器

  • main.go的第19行和第21行分别对着main.txt2个不同的方法runtime.mapaccess1_faststrruntime.mapaccess2_faststr

runtime/map.go的方法包括上面列举的方法:runtime.makemap_smallruntime.makemapruntime.mapiterinit方法

aac871f7bb2ef3deebac633353bf51db.png
runtime/map.go

由于我的示例代码的map的key是string类型,故runtime.mapassign_faststrruntime.mapaccess1_faststrruntime.mapaccess2_faststr方法在runtime/map_faststr.go代码里面,该文件优化了string类型的key的操作:

4c8c871560c12d98e938dc8992396bde.png
runtime/map_faststr.go

go的map对应的结构体hmap

go的map的基础结构体是hmap,在runtime/map.go中,

 1// A header for a Go map.
2type hmap struct {
3    // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go.
4    // Make sure this stays in sync with the compiler's definition.
5    // map存储的键值对个数
6    count     int // # live cells == size of map.  Must be first (used by len() builtin)
7    // 表示map的一些标志位
8    flags     uint8
9    // map的桶的2的对数就是B值
10    B         uint8  // log_2 of # of buckets (can hold up to loadFactor * 2^B items)
11    // 溢出桶个数,是个近似数,不完全相等
12    noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details
13    // hash种子
14    hash0     uint32 // hash seed
15
16    // 桶,真正存数据的地方,2^B个桶
17    buckets    unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
18
19    // 保存一些即将迁移的桶
20    oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing
21    // 从oldbuckets迁移到新的buckets的进度
22    nevacuate  uintptr        // progress counter for evacuation (buckets less than this have been evacuated)
23
24    // 当key不是指针类型的数据的时候,里面会存溢出桶,这样会避免go的扫描
25    extra *mapextra // optional fields
26}

既然是map结构体,为何注释说是一个header呢?这是因为buckets和oldbuckets这2个字段并没有真正存取数据,只是存了一个指针,指向存取buckets的地址,故我们在使用过程中拷贝hmap的时候,并没有真正拷贝map的数据,只是拷贝了hmap这个结构体的一些数据。
在看看hmap的字段mapextra:

 1// mapextra holds fields that are not present on all maps.
2type mapextra struct {
3    // If both key and elem do not contain pointers and are inline, then we mark bucket
4    // 如果key和value都不包括指针并且内敛,然后我们就标记bucket没有指针
5    // type as containing no pointers. This avoids scanning such maps.
6    // 这样会避免gc扫描
7    // However, bmap.overflow is a pointer. In order to keep overflow buckets
8    // 但是,虽然key和value不包括指针,但是逸出桶却是个指针,为了让逸出桶一直
9    // alive, we store pointers to all overflow buckets in hmap.extra.overflow and hmap.extra.oldoverflow.
10    // 存在,所以就把逸出桶和需要迁移的逸出桶的指针存到hamp的extra字段里面
11    // overflow and oldoverflow are only used if key and elem do not contain pointers.
12    // 如果key和elme包含指针,overflow和oldoverflow就不会被使用了
13    // overflow contains overflow buckets for hmap.buckets.
14    // oldoverflow contains overflow buckets for hmap.oldbuckets.
15    // The indirection allows to store a pointer to the slice in hiter.
16    overflow    *[]*bmap
17    oldoverflow *[]*bmap
18
19    // nextOverflow holds a pointer to a free overflow bucket.
20    nextOverflow *bmap
21}

如mapextra结构体为啥说有些字段并不会在所有map里面全部都有呢?mapextra是一个为了优化bucket而设计的,当key或value是指针的时候,此时overflow和oldoverflow就不会被使用,只有nextOverflow会被使用,该字段保存了预先申请的逸出桶,在没有发生扩容的时候,而一个桶或者说bmap的8个tophash都被使用完了,那么就要考虑使用逸出桶。
当key和value都没有指针的时候bucket的bmap的_type的ptrdata就是0,意味着该结构体是没有指针的,申请bmap内存的时候,会申请一个没有指针的span,这样会避免gc扫描该内存,会提高效率,但是bmap的最后一个内存块是确确实实存放指针的,所以用uintptr存储着该map的逸出桶的地址,但是由于没有指向下一个逸出桶,可能会被gc回收掉,所以就需要overflow存取指向该逸出桶的指针避免被gc回收掉。
overflow和oldoverflow的用处差不多,只是oldoverflow为了迁移使用,后面的系列会详说。

bucket的结构体bmap

bmap就是真正存数据的结构体了,bmap在源码中定义十分简单:

 1// A bucket for a Go map.
2type bmap struct {
3    // tophash generally contains the top byte of the hash value
4    // for each key in this bucket. If tophash[0]  5    // tophash[0] is a bucket evacuation state instead. 6    tophash [bucketCnt]uint8 7    // Followed by bucketCnt keys and then bucketCnt elems. 8    // NOTE: packing all the keys together and then all the elems together makes the 9    // code a bit more complicated than alternating key/elem/key/elem/... but it allows10    // us to eliminate padding which would be needed for, e.g., map[int64]int8.11    // Followed by an overflow pointer.12}

但其实真正的在内存中分配的结构体是这样的:

 1// A bucket for a Go map.
2type bmap struct {
3    // tophash generally contains the top byte of the hash value
4    // for each key in this bucket. If tophash[0]  5    // tophash[0] is a bucket evacuation state instead. 6    tophash [bucketCnt]uint8 7    keys [bucketCnt]string // 由于我举例的key是string,故我这里写string 8    values [bucketCnt]string // 由于上面我的例子的value的类型是string,故这里也是string 9    pointer unsafe.pointer  // 由于key和value都是指针,所以这里是一个指针10    // Followed by bucketCnt keys and then bucketCnt elems.11    // NOTE: packing all the keys together and then all the elems together makes the12    // code a bit more complicated than alternating key/elem/key/elem/... but it allows13    // us to eliminate padding which would be needed for, e.g., map[int64]int8.14    // Followed by an overflow pointer.15}

隐藏的字段在map源码中都是靠地址偏移来得到,tophash我们能轻易找到位置,但是如何找到keys、values和pointer呢?
在map中是这么做的:

1    dataOffset = unsafe.Offsetof(struct {
2        b bmap
3        v int64
4    }{}.v)

在64位机器上,需要对齐8个字节,这里int64正好也是8个字节,所以恰好解决内存对齐的问题,找到v的起始地址也就是values的起始地址:

1dataOffset+bucketCnt*2*sys.PtrSize // string16个字节,相当于2个指针,bucketCnt等于8

pointer的起始地址

1dataOffset+bucketCnt*2*sys.PtrSize+sys.PtrSize

tophash存的是key的hash高8位,为了方便查找key,为什么keys和values分别存在一堆呢?不是k|v|k|v这种呢?由于key和value的变量类型可能不一样,对齐系数不一致,可能导致内存不紧凑而浪费内存,所以把8个keys存到一堆,8个values存到一堆,然后最后在pointer之前对齐就可以了。所以此时也能算出来整个bmap的大小:

1bucketCnt*(uint8的字节为1)+bucketCnt*(string的字节16)+bucketCnt*(string的字节16)+指针大小8字节 = 272

在真正调试的时候如查看bucket里面的具体的key和value呢?这里给大家展示一个小技巧,如果大家有其他方法,可以留言讨论:

1type dmap struct {
2    tophash        [bucketCnt]uint8
3    debugKeys      [bucketCnt]string
4    debugElems     [bucketCnt]string
5    //debugOverflows unsafe.Pointer
6    debugOverflows uintptr
7}

这是我定义的调试结构体,将该代码和bmap的结构体放到一堆,当你获取到bmap桶的地址的时候,就可以如下转换,就可以查看bmap的具体值了:

1        b0 := (*dmap)(add(buckets, uintptr(0)*uintptr(t.bucketsize)))
2   asdas     println(b0.debugOverflows)

buckets假设是桶数组的起始地址,加上bucketsize就会得到第二个桶的起始地址,然后直接转型为*dmap,最后你可以可以打印出来你想查看的真实的值了。

map的整体结构

f7dba17e85e8f6073045a38b8dadb7ed.png
map存储结构

如果申请内存桶的时候又多余的溢出桶,那么mapextra的nextOverflow就会指向[]bmap其中的某块桶的地址,地址后之后的桶都是溢出桶。在一个桶装不下的时候,会去溢出桶拿桶然后bmap的overflow指向溢出桶。

总结

上面大概介绍了map的数据结构,后面系列map的具体代码分析,包括增、删、改、查、扩容等都会分篇细解,如有不足之处,请共同讨论学习。

47ddbe4fe7ea8169999fe9f6049bf09f.png
我的微信公众号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值