[{"data":1,"prerenderedAt":829},["ShallowReactive",2],{"content:\u002F2026\u002F02\u002Fgo-delete-element-in-range":3,"surround:\u002F2026\u002F02\u002Fgo-delete-element-in-range":818},{"id":4,"title":5,"body":6,"categories":798,"date":800,"description":801,"draft":802,"extension":803,"image":804,"meta":805,"navigation":48,"path":807,"permalink":804,"published":804,"readingTime":808,"recommend":804,"references":804,"seo":812,"sitemap":813,"stem":814,"tags":815,"type":816,"updated":800,"__hash__":817},"content\u002Fposts\u002F2026\u002F02\u002Fgo-delete-element-in-range.md","Go遍历时删除特定元素",{"type":7,"value":8,"toc":789},"minimark",[9,13,17,20,321,325,419,427,430,434,437,693,696,773,776,782,785],[10,11,12],"p",{},"我们都知道在 Go 语言中可以通过切片语法删除特定元素，但实际开发中，常见的写法其实是有问题的。",[14,15,16],"h2",{"id":16},"错误示例",[10,18,19],{},"下面这段 Go 代码表面上看起来没什么问题，但实际存在 bug：",[21,22,27],"pre",{"className":23,"code":24,"language":25,"meta":26,"style":26},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport \"fmt\"\n\nfunc main() {\n\tm := []string{\"a\", \"b\", \"c\", \"d\"}\n\tfor i, v := range m {\n\t\tfmt.Println(\"len(m)\", len(m), v)\n\t\tif i == 1 {\n\t\t\tm = append(m[:i], m[i+1:]...)\n\t\t}\n\t}\n\tfmt.Println(\"m\", m)\n}\n","go","",[28,29,30,43,50,66,71,94,144,165,202,226,278,289,298,316],"code",{"__ignoreMap":26},[31,32,35,39],"span",{"class":33,"data-line":34,"line":34},"line",1,[31,36,38],{"class":37},"szBVR","package",[31,40,42],{"class":41},"sScJk"," main\n",[31,44,46],{"class":33,"data-line":45,"line":45},2,[31,47,49],{"emptyLinePlaceholder":48},true,"\n",[31,51,53,56,60,63],{"class":33,"data-line":52,"line":52},3,[31,54,55],{"class":37},"import",[31,57,59],{"class":58},"sZZnC"," \"",[31,61,62],{"class":41},"fmt",[31,64,65],{"class":58},"\"\n",[31,67,69],{"class":33,"data-line":68,"line":68},4,[31,70,49],{"emptyLinePlaceholder":48},[31,72,74,77,80,84,87,91],{"class":33,"data-line":73,"line":73},5,[31,75,76],{"class":37},"func",[31,78,79],{"class":41}," main",[31,81,83],{"class":82},"sSDpw","(",[31,85,86],{"class":82},")",[31,88,90],{"class":89},"sVt8B"," ",[31,92,93],{"class":82},"{\n",[31,95,97,101,104,107,109,113,116,119,122,125,128,131,133,136,138,141],{"class":33,"data-line":96,"line":96},6,[31,98,100],{"class":99},"indent","\t",[31,102,103],{"class":89},"m ",[31,105,106],{"class":37},":=",[31,108,90],{"class":89},[31,110,112],{"class":111},"sJX2D","[",[31,114,115],{"class":111},"]",[31,117,118],{"class":37},"string",[31,120,121],{"class":111},"{",[31,123,124],{"class":58},"\"a\"",[31,126,127],{"class":89},", ",[31,129,130],{"class":58},"\"b\"",[31,132,127],{"class":89},[31,134,135],{"class":58},"\"c\"",[31,137,127],{"class":89},[31,139,140],{"class":58},"\"d\"",[31,142,143],{"class":111},"}\n",[31,145,147,149,152,155,157,160,163],{"class":33,"data-line":146,"line":146},7,[31,148,100],{"class":99},[31,150,151],{"class":37},"for",[31,153,154],{"class":89}," i, v ",[31,156,106],{"class":37},[31,158,159],{"class":37}," range",[31,161,162],{"class":89}," m ",[31,164,93],{"class":111},[31,166,168,170,172,175,178,181,184,186,189,191,194,196,199],{"class":33,"data-line":167,"line":167},8,[31,169,100],{"class":99},[31,171,100],{"class":99},[31,173,174],{"class":89},"fmt.",[31,176,177],{"class":41},"Println",[31,179,83],{"class":180},"sqkie",[31,182,183],{"class":58},"\"len(m)\"",[31,185,127],{"class":89},[31,187,188],{"class":41},"len",[31,190,83],{"class":82},[31,192,193],{"class":89},"m",[31,195,86],{"class":82},[31,197,198],{"class":89},", v",[31,200,201],{"class":180},")\n",[31,203,205,207,209,212,215,218,222,224],{"class":33,"data-line":204,"line":204},9,[31,206,100],{"class":99},[31,208,100],{"class":99},[31,210,211],{"class":37},"if",[31,213,214],{"class":89}," i ",[31,216,217],{"class":37},"==",[31,219,221],{"class":220},"sj4cs"," 1",[31,223,90],{"class":89},[31,225,93],{"class":180},[31,227,229,231,233,235,237,240,243,245,247,249,252,254,257,259,262,265,268,271,273,276],{"class":33,"data-line":228,"line":228},10,[31,230,100],{"class":99},[31,232,100],{"class":99},[31,234,100],{"class":99},[31,236,103],{"class":89},[31,238,239],{"class":37},"=",[31,241,242],{"class":41}," append",[31,244,83],{"class":82},[31,246,193],{"class":89},[31,248,112],{"class":111},[31,250,251],{"class":89},":i",[31,253,115],{"class":111},[31,255,256],{"class":89},", m",[31,258,112],{"class":111},[31,260,261],{"class":89},"i",[31,263,264],{"class":37},"+",[31,266,267],{"class":220},"1",[31,269,270],{"class":89},":",[31,272,115],{"class":111},[31,274,275],{"class":37},"...",[31,277,201],{"class":82},[31,279,281,283,285,287],{"class":33,"data-line":280,"line":280},11,[31,282,100],{"class":99},[31,284,100],{"class":99},[31,286,26],{"class":89},[31,288,143],{"class":180},[31,290,292,294,296],{"class":33,"data-line":291,"line":291},12,[31,293,100],{"class":99},[31,295,26],{"class":89},[31,297,143],{"class":111},[31,299,301,303,305,307,309,312,314],{"class":33,"data-line":300,"line":300},13,[31,302,100],{"class":99},[31,304,174],{"class":89},[31,306,177],{"class":41},[31,308,83],{"class":111},[31,310,311],{"class":58},"\"m\"",[31,313,256],{"class":89},[31,315,201],{"class":111},[31,317,319],{"class":33,"data-line":318,"line":318},14,[31,320,143],{"class":82},[322,323,324],"h3",{"id":324},"数据流转解析",[326,327,328,383,416],"ul",{},[329,330,331,332],"li",{},"初始切片内容和索引如下：",[333,334,335,348],"table",{},[336,337,338],"thead",{},[339,340,341,345],"tr",{},[342,343,344],"th",{},"索引",[342,346,347],{},"值",[349,350,351,360,367,375],"tbody",{},[339,352,353,357],{},[354,355,356],"td",{},"0",[354,358,359],{},"a",[339,361,362,364],{},[354,363,267],{},[354,365,366],{},"b",[339,368,369,372],{},[354,370,371],{},"2",[354,373,374],{},"c",[339,376,377,380],{},[354,378,379],{},"3",[354,381,382],{},"d",[329,384,385,386],{},"在遍历到 b 时（i==1），删除 b 这个元素，切片变为：",[333,387,388,396],{},[336,389,390],{},[339,391,392,394],{},[342,393,344],{},[342,395,347],{},[349,397,398,404,410],{},[339,399,400,402],{},[354,401,356],{},[354,403,359],{},[339,405,406,408],{},[354,407,267],{},[354,409,374],{},[339,411,412,414],{},[354,413,371],{},[354,415,382],{},[329,417,418],{},"剩下还有 2 次遍历，且都会输出 d，导致输出如下：",[21,420,425],{"className":421,"code":423,"language":424,"meta":26},[422],"language-text","len(m) 4 a\nlen(m) 4 b\nlen(m) 3 d\nlen(m) 3 d\nm [a c d]\n","text",[28,426,423],{"__ignoreMap":26},[10,428,429],{},"可以看到根本不会打印 c，也就是说循环过程中遗漏了一些元素。",[14,431,433],{"id":432},"正确做法倒序遍历","正确做法：倒序遍历",[10,435,436],{},"最优雅、推荐的做法是倒序遍历切片，然后删除元素。",[21,438,440],{"className":23,"code":439,"language":25,"meta":26,"style":26},"package main\n\nimport \"fmt\"\n\nfunc main() {\n\tm := []string{\"a\", \"b\", \"c\", \"d\"}\n\tfor i := len(m) - 1; i >= 0; i-- {\n\t\tfmt.Println(\"len(m)\", len(m), m[i])\n\t\tif i == 1 {\n\t\t\tm = append(m[:i], m[i+1:]...)\n\t\t}\n\t}\n\tfmt.Println(\"m\", m)\n}\n",[28,441,442,448,452,462,466,480,514,561,595,613,655,665,673,689],{"__ignoreMap":26},[31,443,444,446],{"class":33,"data-line":34,"line":34},[31,445,38],{"class":37},[31,447,42],{"class":41},[31,449,450],{"class":33,"data-line":45,"line":45},[31,451,49],{"emptyLinePlaceholder":48},[31,453,454,456,458,460],{"class":33,"data-line":52,"line":52},[31,455,55],{"class":37},[31,457,59],{"class":58},[31,459,62],{"class":41},[31,461,65],{"class":58},[31,463,464],{"class":33,"data-line":68,"line":68},[31,465,49],{"emptyLinePlaceholder":48},[31,467,468,470,472,474,476,478],{"class":33,"data-line":73,"line":73},[31,469,76],{"class":37},[31,471,79],{"class":41},[31,473,83],{"class":82},[31,475,86],{"class":82},[31,477,90],{"class":89},[31,479,93],{"class":82},[31,481,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512],{"class":33,"data-line":96,"line":96},[31,483,100],{"class":99},[31,485,103],{"class":89},[31,487,106],{"class":37},[31,489,90],{"class":89},[31,491,112],{"class":111},[31,493,115],{"class":111},[31,495,118],{"class":37},[31,497,121],{"class":111},[31,499,124],{"class":58},[31,501,127],{"class":89},[31,503,130],{"class":58},[31,505,127],{"class":89},[31,507,135],{"class":58},[31,509,127],{"class":89},[31,511,140],{"class":58},[31,513,143],{"class":111},[31,515,516,518,520,522,524,527,529,531,533,535,538,540,543,546,548,551,554,557,559],{"class":33,"data-line":146,"line":146},[31,517,100],{"class":99},[31,519,151],{"class":37},[31,521,214],{"class":89},[31,523,106],{"class":37},[31,525,526],{"class":41}," len",[31,528,83],{"class":111},[31,530,193],{"class":89},[31,532,86],{"class":111},[31,534,90],{"class":89},[31,536,537],{"class":37},"-",[31,539,221],{"class":220},[31,541,542],{"class":89},"; i ",[31,544,545],{"class":37},">",[31,547,239],{"class":37},[31,549,550],{"class":220}," 0",[31,552,553],{"class":89},"; i",[31,555,556],{"class":37},"--",[31,558,90],{"class":89},[31,560,93],{"class":111},[31,562,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593],{"class":33,"data-line":167,"line":167},[31,564,100],{"class":99},[31,566,100],{"class":99},[31,568,174],{"class":89},[31,570,177],{"class":41},[31,572,83],{"class":180},[31,574,183],{"class":58},[31,576,127],{"class":89},[31,578,188],{"class":41},[31,580,83],{"class":82},[31,582,193],{"class":89},[31,584,86],{"class":82},[31,586,256],{"class":89},[31,588,112],{"class":82},[31,590,261],{"class":89},[31,592,115],{"class":82},[31,594,201],{"class":180},[31,596,597,599,601,603,605,607,609,611],{"class":33,"data-line":204,"line":204},[31,598,100],{"class":99},[31,600,100],{"class":99},[31,602,211],{"class":37},[31,604,214],{"class":89},[31,606,217],{"class":37},[31,608,221],{"class":220},[31,610,90],{"class":89},[31,612,93],{"class":180},[31,614,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653],{"class":33,"data-line":228,"line":228},[31,616,100],{"class":99},[31,618,100],{"class":99},[31,620,100],{"class":99},[31,622,103],{"class":89},[31,624,239],{"class":37},[31,626,242],{"class":41},[31,628,83],{"class":82},[31,630,193],{"class":89},[31,632,112],{"class":111},[31,634,251],{"class":89},[31,636,115],{"class":111},[31,638,256],{"class":89},[31,640,112],{"class":111},[31,642,261],{"class":89},[31,644,264],{"class":37},[31,646,267],{"class":220},[31,648,270],{"class":89},[31,650,115],{"class":111},[31,652,275],{"class":37},[31,654,201],{"class":82},[31,656,657,659,661,663],{"class":33,"data-line":280,"line":280},[31,658,100],{"class":99},[31,660,100],{"class":99},[31,662,26],{"class":89},[31,664,143],{"class":180},[31,666,667,669,671],{"class":33,"data-line":291,"line":291},[31,668,100],{"class":99},[31,670,26],{"class":89},[31,672,143],{"class":111},[31,674,675,677,679,681,683,685,687],{"class":33,"data-line":300,"line":300},[31,676,100],{"class":99},[31,678,174],{"class":89},[31,680,177],{"class":41},[31,682,83],{"class":111},[31,684,311],{"class":58},[31,686,256],{"class":89},[31,688,201],{"class":111},[31,690,691],{"class":33,"data-line":318,"line":318},[31,692,143],{"class":82},[322,694,695],{"id":695},"过程解析",[326,697,698,737,770],{},[329,699,700,701],{},"初始切片内容和索引：",[333,702,703,711],{},[336,704,705],{},[339,706,707,709],{},[342,708,344],{},[342,710,347],{},[349,712,713,719,725,731],{},[339,714,715,717],{},[354,716,356],{},[354,718,359],{},[339,720,721,723],{},[354,722,267],{},[354,724,366],{},[339,726,727,729],{},[354,728,371],{},[354,730,374],{},[339,732,733,735],{},[354,734,379],{},[354,736,382],{},[329,738,739,740],{},"从索引 3 开始遍历到 0，到 b 的时候（i==1），删除 b，切片变为：",[333,741,742,750],{},[336,743,744],{},[339,745,746,748],{},[342,747,344],{},[342,749,347],{},[349,751,752,758,764],{},[339,753,754,756],{},[354,755,356],{},[354,757,359],{},[339,759,760,762],{},[354,761,267],{},[354,763,374],{},[339,765,766,768],{},[354,767,371],{},[354,769,382],{},[329,771,772],{},"因为是倒序遍历，已经被遍历过的元素不会受影响，所以不会发生漏读。",[322,774,775],{"id":775},"最终输出",[21,777,780],{"className":778,"code":779,"language":424,"meta":26},[422],"len(m) 4 d\nlen(m) 4 c\nlen(m) 4 b\nlen(m) 3 a\nm [a c d]\n",[28,781,779],{"__ignoreMap":26},[10,783,784],{},"这种方式可以保证不会遗漏或重复读取元素，代码也更健壮。",[786,787,788],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":26,"searchDepth":68,"depth":68,"links":790},[791,794],{"id":16,"depth":45,"text":16,"children":792},[793],{"id":324,"depth":52,"text":324},{"id":432,"depth":45,"text":433,"children":795},[796,797],{"id":695,"depth":52,"text":695},{"id":775,"depth":52,"text":775},[799],"Go语言","2026-02-20","Go遍历时候删除元素时候的坑，不能正序删除，不然会引起索引错位",false,"md",null,{"slots":806},{},"\u002F2026\u002F02\u002Fgo-delete-element-in-range",{"text":809,"minutes":45,"time":810,"words":811},"2 min read",120000,400,{"title":5,"description":801},{"loc":807},"posts\u002F2026\u002F02\u002Fgo-delete-element-in-range",[25],"tech","-dF7p9ov3oa6aCvc5TwvKcJBXhMAwJms6FF9LA_NuEo",[819,824],{"title":820,"path":821,"stem":822,"date":823,"type":816,"children":-1},"Golang中的优雅关闭与退出","\u002F2026\u002F02\u002Fgo-graceful-shutdown","posts\u002F2026\u002F02\u002Fgo-graceful-shutdown","2026-02-19",{"title":825,"path":826,"stem":827,"date":828,"type":816,"children":-1},"MySQL 主从复制搭建与配置","\u002F2026\u002F02\u002Fmysql-master-slave-copy","posts\u002F2026\u002F02\u002Fmysql-master-slave-copy","2026-02-27",1786555054314]