Golang delete 函数
最后修改时间 2025 年 5 月 8 日
本教程将讲解如何在 Go 中使用内置的 delete
函数。我们将通过实际示例介绍 map 的基础知识以及从 map 中移除元素的操作。
delete
函数用于从 Go 的 map 中移除元素。它接受一个 map 和一个 key 作为参数,并移除键值对。如果 key 不存在,delete 函数不会执行任何操作,也不会报错。
在 Go 中,delete
函数与 map 一起使用,以动态管理其内容。这是一项安全的操作,即使 key 不在 map 中也不会引发 panic。
基本的 map 删除示例
delete
最简单的用法是从 map 中删除一个键值对。此示例演示了基本的 map 删除操作。
注意: Delete 函数会修改原始 map,而不是副本。
package main import "fmt" func main() { m := map[string]int{ "apple": 5, "banana": 7, "orange": 9, } fmt.Println("Before delete:", m) delete(m, "banana") // Remove the "banana" key fmt.Println("After delete:", m) }
map 中的 "banana" 键已被移除。原始 map 已被修改。剩余的键 "apple" 和 "orange" 保持不变。
删除不存在的键
在 Go 中删除不存在的键是安全的。此示例表明,当 key 不存在时,delete 函数不会执行任何操作。
package main import "fmt" func main() { m := map[int]string{ 1: "one", 2: "two", 3: "three", } fmt.Println("Before delete:", m) delete(m, 4) // Try to delete non-existent key fmt.Println("After delete:", m) // Map remains unchanged }
当 key 不存在时,delete 操作不会影响 map。不会发生错误或 panic,因此在所有情况下都可以安全使用。
删除前检查
我们可以在删除 key 之前检查它是否存在。此示例显示了如何安全地仅删除存在的键。
package main import "fmt" func main() { m := map[string]float64{ "pi": 3.14159, "e": 2.71828, } key := "phi" if _, exists := m[key]; exists { delete(m, key) fmt.Println("Deleted", key) } else { fmt.Println(key, "not found") } fmt.Println("Final map:", m) }
该代码在尝试删除之前检查 key 是否存在。当需要确认删除成功时,这种模式非常有用。
删除嵌套 map 中的元素
从嵌套 map 中删除元素需要仔细处理。此示例展示了如何从 map 中的 map 中删除元素。
package main import "fmt" func main() { users := map[string]map[string]bool{ "john": { "admin": true, "active": true, }, "jane": { "admin": false, "active": true, }, } fmt.Println("Before delete:", users) // Delete the "admin" key from john's properties if user, exists := users["john"]; exists { delete(user, "admin") } fmt.Println("After delete:", users) }
我们首先检查外层 map 的 key 是否存在,然后从内层 map 中删除。这个两步过程确保了对嵌套结构的 safe 操作。
并发场景下的删除
在使用 goroutine 处理 map 时,需要适当的同步。此示例演示了在并发代码中安全删除的操作。
package main import ( "fmt" "sync" ) func main() { var m sync.Map m.Store("a", 1) m.Store("b", 2) m.Store("c", 3) var wg sync.WaitGroup wg.Add(2) // First goroutine deletes "a" go func() { defer wg.Done() m.Delete("a") fmt.Println("Deleted a") }() // Second goroutine deletes "b" go func() { defer wg.Done() m.Delete("b") fmt.Println("Deleted b") }() wg.Wait() // Show remaining keys m.Range(func(key, value interface{}) bool { fmt.Printf("%v: %v\n", key, value) return true }) }
sync.Map
提供了并发安全的 Go map 操作。我们使用 Delete
方法而不是内置的 delete 函数。
来源
本教程通过 map 操作和元素移除的实际示例,讲解了 Go 中的 delete
函数。