ZetCode

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,而不是副本。

basic_delete.go
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 函数不会执行任何操作。

nonexistent_key.go
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 之前检查它是否存在。此示例显示了如何安全地仅删除存在的键。

check_before_delete.go
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 中删除元素。

nested_map.go
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 时,需要适当的同步。此示例演示了在并发代码中安全删除的操作。

concurrent_delete.go
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 函数。

来源

Go 语言规范

本教程通过 map 操作和元素移除的实际示例,讲解了 Go 中的 delete 函数。

作者

我是 Jan Bodnar,一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章,至今已发表超过 1400 篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 Golang 教程