Go中如何在map组成的切片中查找并删除指定元素?
Go 实现方案
问题答疑前置
你对delete函数的疑问核心是Go的类型特性:map属于引用类型,即使range遍历切片时拿到的是元素值拷贝,这个拷贝存的也是指向底层map结构的指针,直接对这个拷贝执行delete操作,修改的就是原map内容,不需要额外操作原切片索引。
1. 删除切片中的指定map元素(高性能、不保留顺序)
不要用常规的append(myMaps[:i], myMaps[i+1:]...)写法,这种写法每次删除都要移动后续所有元素,时间复杂度是O(n²)。你要求不保留顺序的话,用「交换待删元素和末尾元素+截断切片」的方案,整体时间复杂度只有O(n),性能最优:
myMaps := []map[string]interface{} { {"key": "aaa", "key2": 222, "key3": "aafdsafd"}, {"key": "key_to_delete", "key2": 366, "key3": "333aafdsafd"}, {"key": "cccc", "key2": 467, "key3": "jhgfjhg"}, } // 用索引遍历,避免元素值拷贝,同时方便修改切片结构 for i := 0; i < len(myMaps); { if myMaps[i]["key"] == "key_to_delete" { // 把末尾元素覆盖到当前待删位置 myMaps[i] = myMaps[len(myMaps)-1] // 切片截断,去掉最后一位(原待删元素已经被移到最后直接丢弃) myMaps = myMaps[:len(myMaps)-1] } else { // 未命中删除条件才往后遍历,命中的话交换过来的末尾元素还需要校验,所以i不递增 i++ } }
2. 删除某一map内指定key对应的键值对
直接用Go内置的delete函数即可,不管是通过切片索引取到的map,还是range遍历拿到的map副本,都可以直接操作:
// 示例1:range遍历场景删除指定map的键值对 for _, m := range myMaps { if m["key"] == "target_key" { // 直接delete即可,修改的是原map内容 delete(m, "key2") } } // 示例2:结合切片删除操作的完整写法 for i := 0; i < len(myMaps); { currentMap := myMaps[i] if currentMap["key"] == "key_to_delete" { // 先删除map内的指定键值对 delete(currentMap, "key3") // 再把整个map从切片中删除 myMaps[i] = myMaps[len(myMaps)-1] myMaps = myMaps[:len(myMaps)-1] } else { i++ } }
内容的提问来源于stack exchange,提问作者Koharim67
相关产品推荐
相关产品推荐

