{"id":178,"date":"2022-03-03T18:20:13","date_gmt":"2022-03-03T10:20:13","guid":{"rendered":"https:\/\/chenqinghe.com\/?p=178"},"modified":"2022-03-03T18:23:37","modified_gmt":"2022-03-03T10:23:37","slug":"%e5%90%ac%e8%af%b4string%e5%86%85%e5%ae%b9%e4%b8%8d%e8%83%bd%e4%bf%ae%e6%94%b9%ef%bc%9f%e6%88%91%e5%81%8f%e8%a6%81%e6%94%b9%e7%bb%99%e4%bd%a0%e7%9c%8b%ef%bc%81","status":"publish","type":"post","link":"https:\/\/chenqinghe.com\/?p=178","title":{"rendered":"\u542c\u8bf4string\u5185\u5bb9\u4e0d\u80fd\u4fee\u6539\uff1f\u6211\u504f\u8981\u6539\u7ed9\u4f60\u770b\uff01"},"content":{"rendered":"<p>\u5f88\u591a\u6587\u7ae0\u90fd\u8bf4\uff0cGo\u8bed\u8a00\u4e2d\u7684string\u7c7b\u578b\u88ab\u8bbe\u8ba1\u4e3a\u4e0d\u53ef\u4fee\u6539(immutable)\u7684\u3002\u7684\u786e\uff0c\u4eceGo\u8bed\u6cd5\u7684\u89d2\u5ea6\u6765\u8bf4\uff0c\u786e\u5b9e\u662f\u65e0\u6cd5\u4fee\u6539\u7684\u3002\u6bd4\u5982\u5982\u4e0b\u4ee3\u7801\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func main() {\n\ts := \"hello \"\n\ts += \"world\"\n\ts[0] = 'H'\n\tprintln(s)\n}\n\/\/ output:\n.\/main.go:10:2: cannot assign to s[0] (value of type byte)<\/pre>\n<p>\u90a3\u4e48\u6709\u6ca1\u6709\u4ec0\u4e48\u529e\u6cd5\u7a81\u7834\u8fd9\u4e2a\u9650\u5236\u5462\uff1f\u7b54\u6848\u662f\u6709\u7684\u3002<\/p>\n<p>\u5f88\u591a\u6587\u7ae0\u90fd\u8bb2\u8fc7\u901a\u8fc7unsafe.Pointer\u5b9e\u73b0\u65e0\u5185\u5b58\u590d\u5236\u5c06string\u548c[]byte\u7c7b\u578b\u4e92\u8f6c\uff0c\u90a3\u4e48\u53ef\u4ee5\u5c06string\u7c7b\u578b\u8f6c\u6362\u4e3a[]byte\u7c7b\u578b\uff0c\u7136\u540e[]byte\u7c7b\u578b\u662f\u5141\u8bb8\u4fee\u6539\u5176\u5185\u5bb9\u7684\uff0c\u56e0\u6b64\u5c31\u53ef\u4ee5\u8fbe\u5230\u4fee\u6539string\u7684\u76ee\u7684\u3002<\/p>\n<p>string\u7c7b\u578b\u5728\u5e95\u5c42\u8fd0\u884c\u65f6(runtime)\u662f\u4f7f\u7528\u4e00\u4e2astruct\u6765\u8868\u793a\u7684\uff0c\u5176\u4e2d\u5305\u542bstring\u7684\u5730\u5740\u53ca\u957f\u5ea6\u3002\u5176\u5b9a\u4e49\u8fd1\u4f3c\u5982\u4e0b\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ reflect\/value.go \ntype StringHeader struct {\n\tData uintptr\n\tLen  int\n}<\/pre>\n<p>\u8fd9\u4e2a\u7ed3\u6784\u4e0e\u5207\u7247(slice)\u7684\u7ed3\u6784\u76f8\u4f3c\uff0c\u53ea\u662f\u5207\u7247\u8fd8\u591a\u4e86\u4e2a\u5bb9\u91cf\u5b57\u6bb5\uff0c\u5982\u4e0b\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ reflect\/value.go\ntype SliceHeader struct {\n\tData uintptr\n\tLen  int\n\tCap  int\n}<\/pre>\n<p>\u53ea\u8981[]byte\u548cslice\u5171\u7528\u5e95\u5c42\u6570\u636e\uff0c\u90a3\u4e48\u901a\u8fc7\u66f4\u6539[]byte\u5185\u5bb9\u5373\u53ef\u8fbe\u5230\u66f4\u6539string\u5185\u5bb9\u7684\u76ee\u7684\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func main() {\n\ts := \"hello \"\n\ts += \"world\"\n\t\/\/s[0] = 'H'\n\t\/\/println(s)\n\n\tsh := *(*reflect.StringHeader)(unsafe.Pointer(&amp;s))\n\n\tbh := reflect.SliceHeader{\n\t\tData: sh.Data,\n\t\tLen:  sh.Len,\n\t\tCap:  sh.Len,\n\t}\n\n\tbs := *(*[]byte)(unsafe.Pointer(&amp;bh))\n\n\tbs[0] = 'H'\n\tprintln(s)\n}\n\n\/\/ output: \nHello world<\/pre>\n<p>\u8fd9\u5c31\u5b8c\u4e86\uff1f\u90a3\u5f53\u7136\u4e0d\u662f\u4e86\u3002<\/p>\n<p>\u4e0d\u77e5\u9053\u4f60\u6709\u6ca1\u6709\u6ce8\u610f\uff0c\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u4e3a\u4ec0\u4e48\u8981\u628a\u4e24\u4e2a\u5b57\u7b26\u4e32\u52a0\u8d77\u6765\u5462\uff1f\u76f4\u63a5\u8d4b\u503c\u4e00\u4e2a\u5b8c\u6574\u7684&#8221;hello world&#8221;\u4e0d\u597d\u5417\uff1f<\/p>\n<p>\u6765\u8bd5\u8bd5\u597d\u4e86\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"golang\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">func main() {\n\ts := \"hello world\"\n\n\tsh := *(*reflect.StringHeader)(unsafe.Pointer(&amp;s))\n\n\tbh := reflect.SliceHeader{\n\t\tData: sh.Data,\n\t\tLen:  sh.Len,\n\t\tCap:  sh.Len,\n\t}\n\n\tbs := *(*[]byte)(unsafe.Pointer(&amp;bh))\n\n\tbs[0] = 'H'\n\tprintln(s)\n}\n\/\/ output:\nunexpected fault address 0x106a41a\nfatal error: fault\n[signal SIGBUS: bus error code=0x2 addr=0x106a41a pc=0x105a13d]\n\ngoroutine 1 [running]:\nruntime.throw({0x106983d?, 0x11384b0?})\n        \/Users\/qinghe\/sdk\/go1.18beta1\/src\/runtime\/panic.go:992 +0x71 fp=0xc00006cee8 sp=0xc00006ceb8 pc=0x102b391\nruntime.sigpanic()\n        \/Users\/qinghe\/sdk\/go1.18beta1\/src\/runtime\/signal_unix.go:794 +0x1e5 fp=0xc00006cf38 sp=0xc00006cee8 pc=0x103eb85\nmain.main()\n        \/Users\/qinghe\/go\/src\/test\/teststring\/main.go:24 +0x5d fp=0xc00006cf80 sp=0xc00006cf38 pc=0x105a13d\nruntime.main()\n        \/Users\/qinghe\/sdk\/go1.18beta1\/src\/runtime\/proc.go:255 +0x227 fp=0xc00006cfe0 sp=0xc00006cf80 pc=0x102da87\nruntime.goexit()\n        \/Users\/qinghe\/sdk\/go1.18beta1\/src\/runtime\/asm_amd64.s:1571 +0x1 fp=0xc00006cfe8 sp=0xc00006cfe0 pc=0x1051f01\nexit status 2\n<\/pre>\n<p>\u7a0b\u5e8f\u5d29\u4e86\uff01<\/p>\n<p>\u4e3a\u4ec0\u4e48\u76f4\u63a5\u8d4b\u503c\u4e00\u4e2a\u5b8c\u6574\u7684\u5b57\u9762\u91cf\u4e0d\u884c\uff0c\u800c\u505a\u4e2a&#8221;+&#8221;\u64cd\u4f5c\u5c31\u53ef\u4ee5\u4e86\u5462\uff1f<\/p>\n<p>\u901a\u8fc7\u6c47\u7f16\u6765\u4e00\u63a2\u7a76\u7adf\uff1a go tool compile -S main.go\uff0c\u5f97\u5230\u6c47\u7f16\u4ee3\u7801\uff0c\u6458\u53d6\u5176\u4e2d\u4e3b\u8981\u90e8\u5206\uff1a<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">        0x0018 00024 (main.go:8)        FUNCDATA        $2, \"\".main.stkobj(SB)\n        0x0018 00024 (main.go:9)        LEAQ    go.string.\"hello world\"(SB), AX\n        0x001f 00031 (main.go:9)        MOVQ    AX, \"\".s+40(SP)\n        0x0024 00036 (main.go:9)        MOVQ    $11, \"\".s+48(SP)\n        0x002d 00045 (main.go:14)       MOVQ    \"\".s+40(SP), AX\n        0x0032 00050 (main.go:16)       MOVUPS  X15, \"\".bh+16(SP)\n        0x0038 00056 (main.go:16)       MOVQ    $0, \"\".bh+32(SP)\n        0x0041 00065 (main.go:17)       MOVQ    AX, \"\".bh+16(SP)\n        0x0046 00070 (main.go:18)       MOVQ    $11, \"\".bh+24(SP)\n        0x004f 00079 (main.go:19)       MOVQ    $11, \"\".bh+32(SP)\n        0x0058 00088 (main.go:22)       MOVQ    \"\".bh+16(SP), AX\n        0x005d 00093 (main.go:24)       MOVB    $72, (AX)\n        0x0060 00096 (main.go:25)       PCDATA  $1, $1\n        0x0060 00096 (main.go:25)       CALL    runtime.printlock(SB)\n        0x0065 00101 (main.go:25)       MOVQ    \"\".s+40(SP), AX\n        0x006a 00106 (main.go:25)       MOVQ    \"\".s+48(SP), BX\n        0x006f 00111 (main.go:25)       PCDATA  $1, $0\n        0x006f 00111 (main.go:25)       CALL    runtime.printstring(SB)\n        0x0074 00116 (main.go:25)       CALL    runtime.printnl(SB)\n        0x0079 00121 (main.go:25)       CALL    runtime.printunlock(SB)\n        .......\ngo.cuinfo.packagename. SDWARFCUINFO dupok size=0\n        0x0000 6d 61 69 6e                                      main\n\"\"..inittask SNOPTRDATA size=32\n        0x0000 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  ................\n        0x0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................\n        rel 24+8 t=1 reflect..inittask+0\ngo.string.\"hello world\" SRODATA dupok size=11\n        0x0000 68 65 6c 6c 6f 20 77 6f 72 6c 64                 hello world\nruntime.gcbits.01 SRODATA dupok size=1\n        0x0000 01                                               .\n<\/pre>\n<p>\u53ef\u4ee5\u770b\u5230\uff0c&#8221;hello world&#8221;\u662f\u901a\u8fc7\u7b26\u53f7(symbol) go.string.&#8221;hello world&#8221;\u6765\u8868\u793a\u7684\uff0c\u800c\u5728\u4e0b\u9762\u53ef\u4ee5\u770b\u5230\u8fd9\u90e8\u5206\u6570\u636e\u6709SRODATA\u5c5e\u6027\u7684\uff0c\u6807\u8bc6\u8fd9\u90e8\u5206\u6570\u636e\u662f\u5b58\u50a8\u5728\u5185\u5b58\u7684\u53ea\u8bfb\u533a\u57df\uff0c\u56e0\u6b64\uff0c\u5982\u679c\u8981\u5bf9\u8fd9\u90e8\u5206\u6570\u636e\u8fdb\u884c\u4fee\u6539\u7684\u8bdd\uff0c\u81ea\u7136\u662f\u4f1a\u9020\u6210\u5d29\u6e83\u7684\u3002<\/p>\n<p>\u800c\u524d\u9762\u7684\u901a\u8fc7&#8221;+&#8221;\u64cd\u4f5c\u8fdb\u884c\u8d4b\u503c\u7684\u53d8\u91cf\uff0c\u56e0\u4e3a\u5408\u5e76\u4e24\u4e2a\u5b57\u7b26\u4e32\uff0c\u9700\u8981\u91cd\u65b0\u7533\u8bf7\u5185\u5b58\uff0c\u7136\u540e\u590d\u5236\u65e7\u7684\u5b57\u7b26\u4e32\u81f3\u65b0\u7684\u5185\u5b58\u5730\u5740\u3002\u8fd9\u90e8\u5206\u5185\u5b58\u662f\u8981\u901a\u8fc7\u9003\u9038\u5206\u6790\u6765\u5224\u65ad\u662f\u5206\u914d\u5728\u5806\u4e0a\u8fd8\u662f\u6808\u4e0a\u7684\uff0c\u4f46\u662f\u65e0\u8bba\u662f\u5728\u5806\u4e0a\u8fd8\u662f\u5728\u6808\u4e0a\uff0c\u90fd\u4e0d\u662f\u53ea\u8bfb\u7684\uff0c\u4e5f\u5e76\u672a\u901a\u8fc7\u7cfb\u7edf\u8c03\u7528\u8bbe\u7f6e\u53ea\u8bfb\u5c5e\u6027\uff0c\u56e0\u6b64\u53ef\u4ee5\u5bf9\u5b83\u8fdb\u884c\u4fee\u6539\u662f\u6ca1\u6709\u95ee\u9898\u7684\u3002<\/p>\n<h2 class=\"wp-block-heading\">\u603b\u7ed3<\/h2>\n<p><strong>\u901a\u8fc7\u5b57\u9762\u91cf\u65b9\u5f0f\u8d4b\u503c\u7684\u5b57\u7b26\u4e32\u53d8\u91cf<\/strong>\uff0c\u56e0\u4e3a\u5176\u5e95\u5c42\u6570\u636e\u662f\u5b58\u50a8\u5728\u5185\u5b58\u53ea\u8bfb\u533a\u57df\u7684\uff0c\u56e0\u6b64<strong>\u65e0\u6cd5\u8fdb\u884c\u4fee\u6539<\/strong>\u3002\u901a\u8fc7\u5176\u4ed6\u64cd\u4f5c\u5f15\u8d77<strong>\u5e95\u5c42\u5185\u5b58\u91cd\u65b0\u5206\u914d\u7684\u5b57\u7b26\u4e32\u53d8\u91cf\uff0c\u53ef\u4ee5\u8f6c\u6362\u4e3a[]byte\u540e\u518d\u8fdb\u884c\u4fee\u6539<\/strong>\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f88\u591a\u6587\u7ae0\u90fd\u8bf4\uff0cGo\u8bed\u8a00\u4e2d\u7684string\u7c7b\u578b\u88ab\u8bbe\u8ba1\u4e3a\u4e0d\u53ef\u4fee\u6539(immutable)\u7684\u3002\u7684\u786e\uff0c\u4eceGo\u8bed\u6cd5\u7684\u89d2\u5ea6\u6765\u8bf4\uff0c\u786e\u5b9e\u662f\u65e0\u6cd5\u4fee\u6539\u7684\u3002\u6bd4\u5982\u5982\u4e0b\u4ee3\u7801\uff1a \u90a3\u4e48\u6709\u6ca1\u6709\u4ec0\u4e48\u529e\u6cd5\u7a81\u7834\u8fd9\u4e2a\u9650\u5236\u5462\uff1f\u7b54\u6848\u662f\u6709\u7684\u3002 \u5f88\u591a\u6587\u7ae0\u90fd\u8bb2\u8fc7\u901a\u8fc7unsafe.Pointer\u5b9e\u73b0\u65e0\u5185\u5b58\u590d\u5236\u5c06string\u548c[]byte\u7c7b\u578b\u4e92\u8f6c\uff0c\u90a3\u4e48\u53ef\u4ee5\u5c06string\u7c7b\u578b\u8f6c\u6362\u4e3a[]byte\u7c7b\u578b\u2026\u2026<\/p>\n","protected":false},"author":1,"featured_media":180,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/chenqinghe.com\/index.php?rest_route=\/wp\/v2\/posts\/178"}],"collection":[{"href":"https:\/\/chenqinghe.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chenqinghe.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chenqinghe.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chenqinghe.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=178"}],"version-history":[{"count":0,"href":"https:\/\/chenqinghe.com\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chenqinghe.com\/index.php?rest_route=\/wp\/v2\/media\/180"}],"wp:attachment":[{"href":"https:\/\/chenqinghe.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chenqinghe.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chenqinghe.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}