[{"data":1,"prerenderedAt":284},["ShallowReactive",2],{"archive-2023-12-1":3},{"title":4,"articles":5,"hot_article":70,"month_arch":133,"total":110,"cover":281},"2023年12月 - 独孤影的博客",[6,19,29,39,48,60],{"id":7,"title":8,"uri":9,"author":10,"tags":11,"created_at":16,"view_count":17,"content":18},115,"初学rust，不允许遍历过程中修改HashMap","in-rust-its-not-allow-to-modify-content-of-hashmap-while-iter-it","duguying",[12,13,14,15],"rust","HashMap","遍历","修改","2023-12-28 21:07:42",241,"\u003Cp>先看一段代码\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_hash_map\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp: \u003Cspan style=\"color:#f0883e;font-weight:bold\">HashMap\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>HashMap::new();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp.keys().clone();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>k\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>看，它报错\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>error[E0502]: cannot borrow `mp` as mutable because it is also borrowed as immutable\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>   --&gt; src\u002Fprocess.rs:153:9\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>151 |     let x = mp.keys().clone();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |             -- immutable borrow occurs here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>152 |     for k in x {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |              - immutable borrow later used here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>153 |         mp.insert(&#34;k2&#34;, &#34;v1&#34;);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |         ^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>报错告诉我们，不允许将\u003Ccode class=\"inline-code\">mp\u003C\u002Fcode>作为mutable，因为它已经用于immutable了。难道，HashMap插入数据完毕，开始读取数据之后，不能再次插入数据了？我一开始这么怀疑，不应该啊，于是代码改成这样\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_hash_map\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp: \u003Cspan style=\"color:#f0883e;font-weight:bold\">HashMap\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>HashMap::new();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.keys().clone();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>正常了，没报错了。看样子问题出在这个\u003Ccode class=\"inline-code\">for ..in..\u003C\u002Fcode>中。仔细分析代码，我在for中遍历了它的key，或者说我正在将这个HashMap中的数据拿出来，这时候，我在for中尝试往这个HashMap中写入数据，写入数据会让这个HashMap发生变更，这里第一感让我觉得可能有问题。比如我HashMap中有10个元素，我在遍历它，然后在for中间插入新元素，那么是不是有下列问题：1，我的HashMap会不会越遍历越多，会不会永远无法遍历完；2，HashMap是无序的，我将新元素插入HashMap中，会不会导致我已经遍历过的数据由于插入新数据，导致再次被读取出来，因为它可能位置发生变化了嘛。\u003C\u002Fp>\n\n\u003Cp>其实这就是数据竞争和它带来的不确定性问题，rust作为一个内存安全第一的编程语言，编译器会教你做人。\u003C\u002Fp>\n\n\u003Cp>于是，我再改\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_hash_map\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp: \u003Cspan style=\"color:#f0883e;font-weight:bold\">HashMap\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>HashMap::new();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x: Vec\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp.keys().map(\u003Cspan style=\"color:#ff7b72;font-weight:bold\">|\u003C\u002Fspan>k\u003Cspan style=\"color:#ff7b72;font-weight:bold\">|\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>k).collect();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>k\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>这回正常了。可以看到我的操作\u003Ccode class=\"inline-code\">let x: Vec&lt;&amp;str&gt; = mp.keys().map(|k| *k).collect();\u003C\u002Fcode>是将keys()拿到的\u003Ccode class=\"inline-code\">Keys\u003C\u002Fcode>迭代器（仍旧从前面的HashMap里迭代）通过\u003Ccode class=\"inline-code\">.collect()\u003C\u002Fcode>方法将迭代器里的元素“倒”入到\u003Ccode class=\"inline-code\">Vec&lt;&amp;str&gt;\u003C\u002Fcode>，这样这个\u003Ccode class=\"inline-code\">Vec\u003C\u002Fcode>就是一个独立与HashMap内存空间之外的变量，再基于这个Vec进行遍历，就可以避免“边遍历边修改的”的情况了。\u003C\u002Fp>\n\n\u003Cp>那么大家可以思考一下，其他语言，比如golang，遇到这种情况是怎么处理的呢。\u003C\u002Fp>\n",{"id":20,"title":21,"uri":22,"author":10,"tags":23,"created_at":26,"view_count":27,"content":28},114,"初学rust，踩坑私有依赖","private-dependencies-in-rust",[12,24,25],"依赖","git","2023-12-27 22:28:21",431,"\u003Cp>最近尝试在一个项目中引用一个私有crate，这个crate是一个lib，然后存储在私有git仓库中，并且这个git平台不支持rust的crate-index.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>第一坑，引用git依赖\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>于是我在我的项目中这样引用外部依赖包\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[package]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>name = \u003Cspan style=\"color:#a5d6ff\">&#34;las&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>version = \u003Cspan style=\"color:#a5d6ff\">&#34;0.1.1&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>authors = [\u003Cspan style=\"color:#a5d6ff\">&#34;....&#34;\u003C\u002Fspan>]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>edition = \u003Cspan style=\"color:#a5d6ff\">&#34;2018&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>elasticsearch = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;8.5.0-alpha.1&#34;\u003C\u002Fspan>, default-features = \u003Cspan style=\"color:#79c0ff\">false\u003C\u002Fspan>, features = [\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">&#34;rustls-tls&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>logwatcher = \u003Cspan style=\"color:#a5d6ff\">&#34;0.1.1&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>json = \u003Cspan style=\"color:#a5d6ff\">&#34;*&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>reqwest = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;0.11.12&#34;\u003C\u002Fspan>, default-features = \u003Cspan style=\"color:#79c0ff\">false\u003C\u002Fspan>, features = [\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">&#34;blocking&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">&#34;rustls-tls&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>toml = \u003Cspan style=\"color:#a5d6ff\">&#34;0.8.6&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde_derive = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.177&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.177&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde_json = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.104&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>once_cell = \u003Cspan style=\"color:#a5d6ff\">&#34;1.18.0&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>futures = \u003Cspan style=\"color:#a5d6ff\">&#34;0.3&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>tokio = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;*&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;full&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>uuid = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.4&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;v4&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;fast-rng&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;macro-diagnostics&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>chrono = \u003Cspan style=\"color:#a5d6ff\">&#34;0.4&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>core_affinity = \u003Cspan style=\"color:#a5d6ff\">&#34;0.8.0&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>geoip = { git = \u003Cspan style=\"color:#a5d6ff\">&#34;ssh:\u002F\u002Fgit@git.xxxx.com\u002Fxxxx\u002Ftgeoip.git&#34;\u003C\u002Fspan>, branch = \u003Cspan style=\"color:#a5d6ff\">&#34;master&#34;\u003C\u002Fspan>, package = \u003Cspan style=\"color:#a5d6ff\">&#34;geoip&#34;\u003C\u002Fspan> }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>nix = \u003Cspan style=\"color:#a5d6ff\">&#34;0.26&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>libc = \u003Cspan style=\"color:#a5d6ff\">&#34;0.2.146&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>clap = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;4.4.2&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;derive&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>log4rs = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.2.0&#34;\u003C\u002Fspan> }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>log = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;0.4.20&#34;\u003C\u002Fspan> }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[build-dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>regex = \u003Cspan style=\"color:#a5d6ff\">&#34;1.6.0&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>需要注意的是，我\u003Ccode class=\"inline-code\">git@git.xxxx.com:xxxx\u002Ftgeoip.git\u003C\u002Fcode>仓库中是一个workspace，里面有2个子项，一个是可执行bin项目，叫做\u003Ccode class=\"inline-code\">regen\u003C\u002Fcode>，一个是外部可依赖包，叫做\u003Ccode class=\"inline-code\">geoip\u003C\u002Fcode>（后续实践表明同一个workspace里面的子项引用就应该这么干，git路径是同一个，使用package指定子项的包名），我这样引入之后，发现死活拉取不了私有git依赖。报错没权限拉取，git鉴权失败\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>error: failed to get `geoip` as a dependency of package `las v0.1.1 (\u002Fdata\u002Fcode\u002Frust\u002Flas)`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  failed to load source for dependency `geoip`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  Unable to update ssh:\u002F\u002Fgit@git.xxxx.com\u002Fxxxx\u002Ftgeoip.git?branch=master#e41c5279\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  failed to clone into: \u002Froot\u002F.cargo\u002Fgit\u002Fdb\u002Ftgeoip-9094aceea5940357\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  failed to authenticate when downloading repository\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  * attempted ssh-agent authentication, but no usernames succeeded: `git`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  if the git CLI succeeds then `net.git-fetch-with-cli` may help here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  https:\u002F\u002Fdoc.rust-lang.org\u002Fcargo\u002Freference\u002Fconfig.html#netgit-fetch-with-cli\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  no authentication methods succeeded\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>各方查询后，都是建议添加\u003Ca href=\"https:\u002F\u002Fdoc.rust-lang.org\u002Fcargo\u002Freference\u002Fconfig.html#netgit-fetch-with-cli\">这个\u003C\u002Fa>选项，我开始还没搞清楚加在哪儿，但是发现使用环境变量好使。各方尝试后：\u003C\u002Fp>\n\n\u003Cp>添加到\u003Ccode class=\"inline-code\">~\u002F.cargo\u002Fconfig\u003C\u002Fcode>文件中，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[net]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>git-fetch-with-cli = \u003Cspan style=\"color:#79c0ff\">true\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>然后再次执行\u003Ccode class=\"inline-code\">cargo build\u003C\u002Fcode>无需环境变量即可。（前提是你本地已经配置好了访问\u003Ccode class=\"inline-code\">ssh:\u002F\u002Fgit@git.xxxx.com\u002Fxxxx\u002Ftgeoip.git\u003C\u002Fcode>的ssh key）\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>第二坑，外部依赖包要申明为\u003Ccode class=\"inline-code\">rlib\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>我在这个bin项目中引用\u003Ccode class=\"inline-code\">geoip\u003C\u002Fcode>，发现一直报错\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>failed to resolve: use of undeclared crate or module `geoip`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>百思不得其解，最后发现是我依赖包申明类型的问题，我\u003Ccode class=\"inline-code\">Cargo.toml\u003C\u002Fcode>申明的是\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[package]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>....\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[lib]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>name = \u003Cspan style=\"color:#a5d6ff\">&#34;geoip&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>crate-type = [\u003Cspan style=\"color:#a5d6ff\">&#34;staticlib&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;cdylib&#34;\u003C\u002Fspan>]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>bincode = \u003Cspan style=\"color:#a5d6ff\">&#34;1.3.3&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.193&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;derive&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>实际\u003Ccode class=\"inline-code\">lib\u003C\u002Fcode>应该申明\u003Ccode class=\"inline-code\">rlib\u003C\u002Fcode>类型，才能被正常引用，改为如下，更新依赖，就没报错了\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[package]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>....\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[lib]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>name = \u003Cspan style=\"color:#a5d6ff\">&#34;geoip&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>crate-type = [\u003Cspan style=\"color:#a5d6ff\">&#34;staticlib&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;cdylib&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;rlib&#34;\u003C\u002Fspan>]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>bincode = \u003Cspan style=\"color:#a5d6ff\">&#34;1.3.3&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.193&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;derive&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",{"id":30,"title":31,"uri":32,"author":10,"tags":33,"created_at":36,"view_count":37,"content":38},113,"初试riscv机器","try-riscv-machine",[34,35],"riscv64","linux","2023-12-18 09:28:29",135,"\u003Cp>最近入手了一块riscv64的开发板，是某宝上入手的StarFive2，准备拿它当做riscv64架构的服务器用来编译程序。开始刷上的是官方给的debian系统，成功启动了，nvme正常，但是有两个问题，第一个是\u003Ccode class=\"inline-code\">apt update\u003C\u002Fcode>会报签名错误，第二个是不支持docker，想要让它支持docker，需要自己编译升级内核，非常麻烦。于是决定换用ubuntu版本的镜像。\u003C\u002Fp>\n\n\u003Cp>根据\u003Ca href=\"https:\u002F\u002Fwiki.ubuntu.com\u002FRISC-V\u002FStarFive%20VisionFive%202\">官方教程\u003C\u002Fa>，需要先将板载固件刷新到ubuntu社区的指定版本，从\u003Ca href=\"https:\u002F\u002Flaunchpad.net\u002F~ubuntu-risc-v-team\u002F+archive\u002Fubuntu\u002Frelease\u002F+packages\">这里\u003C\u002Fa>下载，需要注意的是，目前（2023\u002F12\u002F18）最新版的固件（\u003Ccode class=\"inline-code\">u-boot-starfive-2024.01~rc4-0ubuntu1~ppa1\u003C\u002Fcode>这个）会导致\u003Ccode class=\"inline-code\">kernel panic\u003C\u002Fcode>，需要下载下面的版本\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2023\u002F12\u002F2flhl8vj.webp\" alt=\"2flhl8vj\" \u002F>，展开后，用wget下载deb安装包，找个ubuntu机器，用\u003Ccode class=\"inline-code\">dpkg -x\u003C\u002Fcode>解包，将里面的下面两个文件上传到\u003Ccode class=\"inline-code\">sdcard.img\u003C\u002Fcode>刷机包启动的系统里面\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2023\u002F12\u002Fg80xfqba.webp\" alt=\"g80xfqba\" \u002F>\u003C\u002Fp>\n\n\u003Cp>更新SPL\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>flashcp -v u-boot-spl.bin.normal.out \u002Fdev\u002Fmtd0\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>更新U-Boot\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>flashcp -v u-boot.itb \u002Fdev\u002Fmtd2\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>然后安装ubuntu系统，注意从\u003Ca href=\"https:\u002F\u002Fcdimage.ubuntu.com\u002Freleases\u002F23.04\u002Frelease\u002F\">这里\u003C\u002Fa>选择下面版本的系统\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2023\u002F12\u002Fjerua3mn.webp\" alt=\"jerua3mn\" \u002F>\u003C\u002Fp>\n\n\u003Cp>使用etcher将固件写入到sd卡，插入sd卡，启动，正常情况就可以启动成功。\u003C\u002Fp>\n\n\u003Cp>在这中间我踩过一些坑，在此也一起分享一下。首先是hdmi插在4k屏无法显示，这样一来，我就不知道当前系统启动得怎么样了，因此\u003Ccode class=\"inline-code\">kernel panic\u003C\u002Fcode>了，我也不知道，后来只能使用usb转串口用电脑连接串口，将串口控制台当做显示器用，才知道启动过程中发生了什么，串口连接如下图\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2023\u002F12\u002F3atnih7j.png\" alt=\"3atnih7j\" \u002F>\u003C\u002Fp>\n\n\u003Cp>从串口控制台看到如下图（学到了，串口还能当显示器用）\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2023\u002F12\u002Fy2m6970v.webp\" alt=\"y2m6970v\" \u002F>\u003C\u002Fp>\n\n\u003Cp>可以看到，启动过程卡死在\u003Ccode class=\"inline-code\">kernel panic\u003C\u002Fcode>，我这才知道是内核崩溃了。看起来是\u003Ccode class=\"inline-code\">u-boot-starfive-2024.01~rc4-0ubuntu1~ppa1\u003C\u002Fcode>这个版本的固件，对现有的\u003Ccode class=\"inline-code\">23.04\u003C\u002Fcode>版本的系统兼容性有问题，所以我换了上个版本的固件，成功启动。\u003C\u002Fp>\n\n\u003Cp>到此，在StarFive2上成功的安装上了ubuntu系统，docker也成功的安装，不过这个版本的板载固件\n有个问题，就是无法识别nvme硬盘，希望下个正常版本能够支持。\u003C\u002Fp>\n",{"id":40,"title":41,"uri":42,"author":10,"tags":43,"created_at":45,"view_count":46,"content":47},112,"初学rust，错误处理","rust-beginners-guide-error-handle",[44,12],"错误处理","2023-12-14 14:55:54",172,"\u003Cp>rust中如何比较优雅的进行错误处理，这是一直以来困扰我的一个问题。最近写了一个ip地址库查询包，于是在其中实践了一下自定义错误、错误抛出等处理。\u003C\u002Fp>\n\n\u003Cp>rust中，如果一个函数需要返回错误，那么应该用\u003Ccode class=\"inline-code\">Result\u003C\u002Fcode>包裹返回值，\u003Ccode class=\"inline-code\">Result\u003C\u002Fcode>定义如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">enum\u003C\u002Fspan> Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>T,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>E\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(T),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Err(E),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>通常，\u003Ccode class=\"inline-code\">Result\u003C\u002Fcode>中的第二个参数就是错误。比如\u003Ccode class=\"inline-code\">Result&lt;String, String&gt;\u003C\u002Fcode>，那么它的错误就是一个String类型的值，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 返回了正常值hi\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>String,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">hi\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>.to_string())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 返回了错误信息error\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>String,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Err(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>.to_string())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>那么有另外一个问题，就是，我们如何处理其他库或者第三方函数抛出给我们的错误呢？我们可以用\u003Ccode class=\"inline-code\">expect()\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">unwrap()\u003C\u002Fcode>来解决可以解决的错误，但是有时候我们不希望处理错误，希望能够将错误抛出给上层，让上层调用者去处理。这时候，我们应该怎么定义错误类型？你当然可以在你的函数中进行错误处理之后，抛出\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>类型的错误，以便继续使用\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>类型作为错误类型。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>foo();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x.unwrap())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">foo\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>bar();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">match\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Err(e)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Err(e.to_string()),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Ok(f)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Ok(f),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">..\u003C\u002Fspan>.\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">bar\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>io::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>File::open(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">regions.txt\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>)\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>你可以看到，我在\u003Ccode class=\"inline-code\">foo()\u003C\u002Fcode>中调用\u003Ccode class=\"inline-code\">bar()\u003C\u002Fcode>，\u003Ccode class=\"inline-code\">bar()\u003C\u002Fcode>中返回了一个包含\u003Ccode class=\"inline-code\">io::Error\u003C\u002Fcode>的错误，而我的\u003Ccode class=\"inline-code\">foo()\u003C\u002Fcode>中要求返回的是\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>，我在\u003Ccode class=\"inline-code\">foo\u003C\u002Fcode>中用\u003Ccode class=\"inline-code\">match\u003C\u002Fcode>处理了错误的情况，并且\u003Ccode class=\"inline-code\">foo\u003C\u002Fcode>中可能调用其他第三方库函数，返回的错误类型不尽相同，我每种错误类型都可以使用\u003Ccode class=\"inline-code\">match\u003C\u002Fcode>解开，然后返回\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>类型的错误。但是这样处理起来，代码看起来就非常乱，到处都是\u003Ccode class=\"inline-code\">match\u003C\u002Fcode>错误。\u003C\u002Fp>\n\n\u003Cp>其实我们有另一种方法，可以自己定义一个\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>类型，然后对\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>类型进行扩展，让它兼容其他类型，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::{fmt,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>io};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">derive(Debug)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">enum\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">Error\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>ParseError,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>ReadError,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>InvalidIPError,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::error::Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>fmt::Display\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">fmt\u003C\u002Fspan>(\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>self,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f: \u003Cspan style=\"color:#79c0ff\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#f0883e;font-weight:bold\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>fmt::Formatter)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">fmt\u003C\u002Fspan>::Result\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">match\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>self\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>Error::ParseError\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>write!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(f,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Parse Error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>Error::ReadError\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>write!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(f,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Read Error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>Error::InvalidIPError\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>write!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(f,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Invalid IP Error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>From\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>io::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">from\u003C\u002Fspan>(_: \u003Cspan style=\"color:#f0883e;font-weight:bold\">io\u003C\u002Fspan>::Error)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Error::ReadError\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>From\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>bincode::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">from\u003C\u002Fspan>(_: \u003Cspan style=\"color:#f0883e;font-weight:bold\">bincode\u003C\u002Fspan>::Error)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Error::ParseError\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>From\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>std::net::AddrParseError\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">from\u003C\u002Fspan>(_: \u003Cspan style=\"color:#f0883e;font-weight:bold\">std\u003C\u002Fspan>::net::AddrParseError)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Error::InvalidIPError\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>我们的\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>类型，实现了\u003Ccode class=\"inline-code\">fmt::Display\u003C\u002Fcode>，让它能够处理我的包项目中可能出现的第三方错误，并且针对这些错误实现了各自的\u003Ccode class=\"inline-code\">From&lt;T&gt;\u003C\u002Fcode>的\u003Ccode class=\"inline-code\">from\u003C\u002Fcode>方法，这样，这些第三方错误就可以直接以我的\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>返回，使用?简写之后，代码就改成这样了\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>foo();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x.unwrap())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">foo\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>bar()\u003Cspan style=\"color:#ff7b72;font-weight:bold\">?\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(x)\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">bar\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>io::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>File::open(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">regions.txt\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>)\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>对比可以看到，我在foo中处理bar抛出的错误变得简单了，直接一个问号就将可能得错误抛出到\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>了，然后再将\u003Ccode class=\"inline-code\">Ok(x)\u003C\u002Fcode>返回。这样一来，错误的抛出和处理就变得优雅多了。\u003C\u002Fp>\n",{"id":49,"title":50,"uri":51,"author":10,"tags":52,"created_at":57,"view_count":58,"content":59},111,"gin.Context 异步调用踩坑","gin-context-gorountine",[53,54,55,56],"gin","context","异步","goroutine","2023-12-08 12:20:18",448,"\u003Cp>事情的背景是这样了，我在gin框架的action中有个异步调用逻辑，然后异步调用需要使用\u003Ccode class=\"inline-code\">context.Context\u003C\u002Fcode>接口作为参数传入，异步调用的模块中会从context中取request_id作为追踪追踪标记。于是我就直接讲*gin.Context作为参数传入了异步调用中。\u003C\u002Fp>\n\n\u003Cp>然后灾难就发生了，我日志记录中能查到当前请求的request_id，但是发现条数不对，异步请求中记录的日志条数有10条，我用request_id去搜索，只查到了4条，最后我只能添加另外标记，通过另外的标记查询到10条日志，让我奇怪的是，另外6条日志的request_id却不是当前请求的request_id。\u003C\u002Fp>\n\n\u003Cp>最后，我发现gin.Context专门有个Copy方法，是将context拷贝一份，我调用Copy拷贝一份context之后将拷贝的context传入异步调用，果然10条日志的request_id一致了。看来，从gin框架传入进来的context在不同的action中是复用的。然后在请求处理完毕之后，会给其他请求复用，这样传给异步调用模块的context中的request_id已经变了。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>r.\u003Cspan style=\"color:#d2a8ff;font-weight:bold\">GET\u003C\u002Fspan>(\u003Cspan style=\"color:#a5d6ff\">&#34;\u002Fasync&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#ff7b72\">func\u003C\u002Fspan>(c \u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>gin.Context) {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\t\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 需要搞一个副本\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\tcopyContext \u003Cspan style=\"color:#ff7b72;font-weight:bold\">:=\u003C\u002Fspan> c.\u003Cspan style=\"color:#d2a8ff;font-weight:bold\">Copy\u003C\u002Fspan>()\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\t\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 异步处理\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\t\u003Cspan style=\"color:#ff7b72\">go\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72\">func\u003C\u002Fspan>() {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\t\ttime.\u003Cspan style=\"color:#d2a8ff;font-weight:bold\">Sleep\u003C\u002Fspan>(\u003Cspan style=\"color:#a5d6ff\">3\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan> time.Second)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\t\tlog.\u003Cspan style=\"color:#d2a8ff;font-weight:bold\">Println\u003C\u002Fspan>(\u003Cspan style=\"color:#a5d6ff\">&#34;异步执行：&#34;\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">+\u003C\u002Fspan> copyContext.Request.URL.Path)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\t}()\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>})\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>这里必须要谨记，如果需要在action中异步调用并使用context传参，必须要将context.Copy()之后再传入。否则context就会被其他协程修改。\u003C\u002Fp>\n",{"id":61,"title":62,"uri":63,"author":10,"tags":64,"created_at":67,"view_count":68,"content":69},110,"Bazel对依赖库进行patch遇到的问题","the-problem-in-patch-deps-with-bazel",[65,66,24],"bazel","patch","2023-12-07 12:24:09",457,"\u003Cp>最近使用bazel需要对一个go第三方依赖进行patch，这个依赖是gorm\u002Fv1，原作者对v1已经放弃了，我们项目中使用了v1，但是因为v1到v2是不兼容的升级，所以我们项目中无法升级。针对v1的优化和bug修复，就只能使用patch的方式进行了。\u003C\u002Fp>\n\n\u003Cp>第一步将\u003Ccode class=\"inline-code\">github.com\u002Fjinzhu\u002Fgorm\u003C\u002Fcode>克隆下来，check出最后一个版本v1.9.16，然后做修改。修改完毕之后，不要进行git提交，执行\u003Ccode class=\"inline-code\">git diff &gt;&gt; new1.patch\u003C\u002Fcode>将会生成这次变更的patch文件。\u003C\u002Fp>\n\n\u003Cp>将patch文件存储如下\u003Ccode class=\"inline-code\">0001-go-errors.patch\u003C\u002Fcode>\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>third_party_patches\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>└── com_github_jinzhu_gorm\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    ├── 0001-go-errors.patch\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    ├── 0002-fix-sqlite.patch\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    └── BUILD.bazel\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>其中，\u003Ccode class=\"inline-code\">BUILD.bazel\u003C\u002Fcode>空文件即可。另外\u003Ccode class=\"inline-code\">deps.bzl\u003C\u002Fcode>中的引用如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>go_repository(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    name \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">com_github_jinzhu_gorm\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    build_file_proto_mode \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">disable\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    importpath \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">github.com\u002Fjinzhu\u002Fgorm\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    patch_args \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> [\u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">-p1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    patches \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> [\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">\u002F\u002Fthird_party_patches\u002Fcom_github_jinzhu_gorm:0001-go-errors.patch\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">\u002F\u002Fthird_party_patches\u002Fcom_github_jinzhu_gorm:0002-fix-sqlite.patch\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    ],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    sum \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">h1:+IyIjPEABKRpsu\u002FF8OvDPy9fyQlgsg2luMV2ZIH5i5o=\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    version \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1.9.16\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>)\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>但是我编译的时候，却报错了\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>➜  code git:\u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>feature\u002Fmigrate-flow\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan> ✗ bazel build \u002F\u002F...\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>INFO: Analyzed \u003Cspan style=\"color:#a5d6ff\">74\u003C\u002Fspan> targets \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">3\u003C\u002Fspan> packages loaded, \u003Cspan style=\"color:#a5d6ff\">141\u003C\u002Fspan> targets configured\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>INFO: Found \u003Cspan style=\"color:#a5d6ff\">74\u003C\u002Fspan> targets...\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>ERROR: \u002Froot\u002F.cache\u002Fbazel\u002F_bazel_root\u002Faa05a35ce6b6cd2ce6b5a504fd9d9e22\u002Fexternal\u002Fcom_github_jinzhu_gorm\u002FBUILD.bazel:3:11: GoCompilePkg external\u002Fcom_github_jinzhu_gorm\u002Fgorm.a failed: \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>Exit 1\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>: builder failed: error executing command bazel-out\u002Fhost\u002Fbin\u002Fexternal\u002Fgo_sdk\u002Fbuilder compilepkg -sdk external\u002Fgo_sdk -installsuffix linux_amd64 -tags sqlite -src external\u002Fcom_github_jinzhu_gorm\u002Fassociation.go -src ... \u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>remaining \u003Cspan style=\"color:#a5d6ff\">71\u003C\u002Fspan> argument\u003Cspan style=\"color:#ff7b72;font-weight:bold\">(\u003C\u002Fspan>s\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan> skipped\u003Cspan style=\"color:#ff7b72;font-weight:bold\">)\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Use --sandbox_debug to see verbose messages from the sandbox\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>compilepkg: missing strict dependencies:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u002Froot\u002F.cache\u002Fbazel\u002F_bazel_root\u002Faa05a35ce6b6cd2ce6b5a504fd9d9e22\u002Fsandbox\u002Flinux-sandbox\u002F4877\u002Fexecroot\u002Fias-admin\u002Fexternal\u002Fcom_github_jinzhu_gorm\u002Fmain.go: import of \u003Cspan style=\"color:#a5d6ff\">&#34;github.com\u002Fgo-errors\u002Ferrors&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>No dependencies were provided.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Check that imports in Go sources match importpath attributes in deps.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>INFO: Elapsed time: 0.843s, Critical Path: 0.06s\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>INFO: \u003Cspan style=\"color:#a5d6ff\">4\u003C\u002Fspan> processes: \u003Cspan style=\"color:#a5d6ff\">4\u003C\u002Fspan> internal.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>FAILED: Build did NOT complete successfully\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>按照报错打开bazel cache路径，发现bazel为依赖生成的BUILD.bazel文件中，并没有添加我patch中引入的依赖。于是我将cache中的BUILD.bazel拷贝出来，手动加入依赖，然后git diff，得到BUILD.bazel的patch文件如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">diff --git a\u002FBUILD.bazel b\u002FBUILD.bazel\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">index 0849476..d26e9f7 100644\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">\u003C\u002Fspan>\u003Cspan style=\"color:#ffa198;background-color:#490202\">--- a\u002FBUILD.bazel\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ffa198;background-color:#490202\">\u003C\u002Fspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">+++ b\u002FBUILD.bazel\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">@@ -32,7 +32,10 @@ go_library(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>     ],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>     importpath = &#34;github.com\u002Fjinzhu\u002Fgorm&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>     visibility = [&#34;\u002F\u002Fvisibility:public&#34;],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ffa198;background-color:#490202\">-    deps = [&#34;@com_github_jinzhu_inflection\u002F\u002F:inflection&#34;],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ffa198;background-color:#490202\">\u003C\u002Fspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">+    deps = [\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">\u003C\u002Fspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">+        &#34;@com_github_jinzhu_inflection\u002F\u002F:inflection&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">\u003C\u002Fspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">+        &#34;@com_github_go_errors_errors\u002F\u002F:go_default_library&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">\u003C\u002Fspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">+    ],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">\u003C\u002Fspan> )\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan> \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan> alias(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff\">@@ -76,5 +79,6 @@ go_test(\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>         &#34;\u002F\u002Fdialects\u002Fsqlite&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>         &#34;@com_github_erikstmartin_go_testdb\u002F\u002F:go-testdb&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>         &#34;@com_github_jinzhu_now\u002F\u002F:now&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">+        &#34;@com_github_go_errors_errors\u002F\u002F:go_default_library&#34;,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#56d364;background-color:#0f5323\">\u003C\u002Fspan>     ],\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan> )\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>加入到我们的patch中，然后再次编译，就正常了。\u003C\u002Fp>\n\n\u003Cp>我推断bazel patch这里面的逻辑是，先拉下原始包，第二步生成BUILD.bazel，最后再patch。google的研发bazel的人简直就是没长脑子，这样的步骤我还要它生成BUILD.bazel干啥，还不如直接把BUILD.bazel生成到patch文件里。总之，折腾了许久总算解决了，记录一下。\u003C\u002Fp>\n",{"title":71,"list":72},"最热文章",[73,79,85,91,97,103,109,115,121,127],{"id":74,"title":75,"uri":76,"author":10,"created_at":77,"view_count":78},28,"docker容器目录与主机目录同步","\u002Farticle\u002Fdocker容器目录与主机目录同步","2014-12-31 12:34:08",15570,{"id":80,"title":81,"uri":82,"author":10,"created_at":83,"view_count":84},21,"beego中使用fis","\u002Farticle\u002Fbeego中使用fis","2014-12-03 10:47:56",9250,{"id":86,"title":87,"uri":88,"author":10,"created_at":89,"view_count":90},20,"用github登录，oauth开发","\u002Farticle\u002F用github登录，oauth开发","2014-11-23 13:33:37",9113,{"id":92,"title":93,"uri":94,"author":10,"created_at":95,"view_count":96},18,"windows服务注册工具nssm","\u002Farticle\u002Fwindows服务注册工具nssm","2014-10-31 21:34:39",9047,{"id":98,"title":99,"uri":100,"author":10,"created_at":101,"view_count":102},49,"用latex排版中文书籍","\u002Farticle\u002F用latex排版中文书籍","2016-10-31 11:12:02",8634,{"id":104,"title":105,"uri":106,"author":10,"created_at":107,"view_count":108},19,"texlive中文书签乱码","\u002Farticle\u002Ftexlive中文书签乱码","2014-11-15 02:54:01",8461,{"id":110,"title":111,"uri":112,"author":10,"created_at":113,"view_count":114},6,"Windows上的软件包管理器chocolatey","\u002Farticle\u002FWindows上的软件包管理器chocolatey","2014-08-10 15:55:22",8009,{"id":116,"title":117,"uri":118,"author":10,"created_at":119,"view_count":120},3,"利用开源和免费资源搭建CI环境","\u002Farticle\u002F利用开源和免费资源搭建CI环境","2014-07-04 16:54:58",7732,{"id":122,"title":123,"uri":124,"author":10,"created_at":125,"view_count":126},16,"php-fpm网站目录权限配置","\u002Farticle\u002Fphp-fpm网站目录权限配置","2014-10-18 01:36:10",7274,{"id":128,"title":129,"uri":130,"author":10,"created_at":131,"view_count":132},27,"sublime text 2插件开发，外部修改文件无法重新加载","\u002Farticle\u002Fsublime text 2插件开发，外部修改文件无法重新加载","2014-12-26 20:24:13",7054,{"title":134,"list":135},"按月归档",[136,140,143,146,149,152,155,159,163,166,169,172,176,179,182,186,189,192,195,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,263,266,269,272,275,278],{"title":137,"uri":138,"view_count":139},"2026年7月","\u002Farchive\u002F2026\u002F7\u002F1","[1]",{"title":141,"uri":142,"view_count":139},"2026年1月","\u002Farchive\u002F2026\u002F1\u002F1",{"title":144,"uri":145,"view_count":139},"2025年4月","\u002Farchive\u002F2025\u002F4\u002F1",{"title":147,"uri":148,"view_count":139},"2024年6月","\u002Farchive\u002F2024\u002F6\u002F1",{"title":150,"uri":151,"view_count":139},"2024年5月","\u002Farchive\u002F2024\u002F5\u002F1",{"title":153,"uri":154,"view_count":139},"2024年4月","\u002Farchive\u002F2024\u002F4\u002F1",{"title":156,"uri":157,"view_count":158},"2023年12月","\u002Farchive\u002F2023\u002F12\u002F1","[6]",{"title":160,"uri":161,"view_count":162},"2023年11月","\u002Farchive\u002F2023\u002F11\u002F1","[2]",{"title":164,"uri":165,"view_count":139},"2023年10月","\u002Farchive\u002F2023\u002F10\u002F1",{"title":167,"uri":168,"view_count":139},"2023年7月","\u002Farchive\u002F2023\u002F7\u002F1",{"title":170,"uri":171,"view_count":162},"2023年6月","\u002Farchive\u002F2023\u002F6\u002F1",{"title":173,"uri":174,"view_count":175},"2023年5月","\u002Farchive\u002F2023\u002F5\u002F1","[3]",{"title":177,"uri":178,"view_count":162},"2023年4月","\u002Farchive\u002F2023\u002F4\u002F1",{"title":180,"uri":181,"view_count":162},"2023年3月","\u002Farchive\u002F2023\u002F3\u002F1",{"title":183,"uri":184,"view_count":185},"2023年2月","\u002Farchive\u002F2023\u002F2\u002F1","[5]",{"title":187,"uri":188,"view_count":139},"2023年1月","\u002Farchive\u002F2023\u002F1\u002F1",{"title":190,"uri":191,"view_count":162},"2022年12月","\u002Farchive\u002F2022\u002F12\u002F1",{"title":193,"uri":194,"view_count":185},"2022年11月","\u002Farchive\u002F2022\u002F11\u002F1",{"title":196,"uri":197,"view_count":198},"2022年10月","\u002Farchive\u002F2022\u002F10\u002F1","[4]",{"title":200,"uri":201,"view_count":158},"2022年9月","\u002Farchive\u002F2022\u002F9\u002F1",{"title":203,"uri":204,"view_count":185},"2022年8月","\u002Farchive\u002F2022\u002F8\u002F1",{"title":206,"uri":207,"view_count":139},"2019年7月","\u002Farchive\u002F2019\u002F7\u002F1",{"title":209,"uri":210,"view_count":139},"2019年2月","\u002Farchive\u002F2019\u002F2\u002F1",{"title":212,"uri":213,"view_count":139},"2018年9月","\u002Farchive\u002F2018\u002F9\u002F1",{"title":215,"uri":216,"view_count":139},"2018年8月","\u002Farchive\u002F2018\u002F8\u002F1",{"title":218,"uri":219,"view_count":139},"2017年11月","\u002Farchive\u002F2017\u002F11\u002F1",{"title":221,"uri":222,"view_count":139},"2017年8月","\u002Farchive\u002F2017\u002F8\u002F1",{"title":224,"uri":225,"view_count":139},"2017年5月","\u002Farchive\u002F2017\u002F5\u002F1",{"title":227,"uri":228,"view_count":139},"2017年4月","\u002Farchive\u002F2017\u002F4\u002F1",{"title":230,"uri":231,"view_count":139},"2016年11月","\u002Farchive\u002F2016\u002F11\u002F1",{"title":233,"uri":234,"view_count":139},"2016年10月","\u002Farchive\u002F2016\u002F10\u002F1",{"title":236,"uri":237,"view_count":162},"2016年9月","\u002Farchive\u002F2016\u002F9\u002F1",{"title":239,"uri":240,"view_count":139},"2016年8月","\u002Farchive\u002F2016\u002F8\u002F1",{"title":242,"uri":243,"view_count":162},"2016年7月","\u002Farchive\u002F2016\u002F7\u002F1",{"title":245,"uri":246,"view_count":185},"2016年6月","\u002Farchive\u002F2016\u002F6\u002F1",{"title":248,"uri":249,"view_count":139},"2015年12月","\u002Farchive\u002F2015\u002F12\u002F1",{"title":251,"uri":252,"view_count":139},"2015年10月","\u002Farchive\u002F2015\u002F10\u002F1",{"title":254,"uri":255,"view_count":162},"2015年2月","\u002Farchive\u002F2015\u002F2\u002F1",{"title":257,"uri":258,"view_count":139},"2015年1月","\u002Farchive\u002F2015\u002F1\u002F1",{"title":260,"uri":261,"view_count":262},"2014年12月","\u002Farchive\u002F2014\u002F12\u002F1","[8]",{"title":264,"uri":265,"view_count":162},"2014年11月","\u002Farchive\u002F2014\u002F11\u002F1",{"title":267,"uri":268,"view_count":185},"2014年10月","\u002Farchive\u002F2014\u002F10\u002F1",{"title":270,"uri":271,"view_count":175},"2014年9月","\u002Farchive\u002F2014\u002F9\u002F1",{"title":273,"uri":274,"view_count":175},"2014年8月","\u002Farchive\u002F2014\u002F8\u002F1",{"title":276,"uri":277,"view_count":175},"2014年7月","\u002Farchive\u002F2014\u002F7\u002F1",{"title":279,"uri":280,"view_count":162},"2013年9月","\u002Farchive\u002F2013\u002F9\u002F1",{"url":282,"title":283},"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F09\u002Fij6x8o4s.webp","老家 摄于2020年秋",1790062261493]