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 函数。