ZetCode

Golang maps.Keys

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 maps.Keys 函数。我们将通过提取键的实际示例来讲解 Map 操作。

maps.Keys 函数返回一个包含 Map 中所有键的切片。它是 Go 实验性 maps 包的一部分。

当您需要单独处理 Map 的键时,例如进行迭代或进一步处理,此函数非常有用。键的顺序不保证。

基本的 maps.Keys 示例

maps.Keys 最简单的用法是从字符串到整数的 Map 中提取键。我们创建一个 Map 并将其所有键获取到一个切片中。

basic_keys.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    fruitPrices := map[string]int{
        "apple":  5,
        "banana": 3,
        "orange": 4,
    }
    
    keys := maps.Keys(fruitPrices)
    fmt.Println("Fruit keys:", keys)
}

我们创建一个水果价格 Map,并使用 maps.Keys 提取所有键。输出将以任意顺序显示水果名称。

处理数值键

maps.Keys 可用于具有数值键的 Map。此示例演示了如何从整数到字符串的 Map 中获取键。

numeric_keys.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    statusCodes := map[int]string{
        200: "OK",
        404: "Not Found",
        500: "Internal Server Error",
    }
    
    codes := maps.Keys(statusCodes)
    fmt.Println("HTTP status codes:", codes)
}

该函数返回一个包含 HTTP 状态码的整数切片。输出中代码的顺序可能会有所不同。

空 Map 的行为

maps.Keys 能妥善处理空 Map。此示例演示了它在空 Map 上的行为。

empty_map.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    emptyMap := map[string]bool{}
    
    keys := maps.Keys(emptyMap)
    fmt.Println("Keys from empty map:", keys)
    fmt.Println("Length of keys slice:", len(keys))
}

当在空 Map 上调用时,maps.Keys 返回一个空切片。返回切片的长度将为零。

使用键进行迭代

一种常见的用法是迭代 Map 键。此示例演示了在提取键后如何处理每个键。

key_iteration.go
package main

import (
    "fmt"
    "maps"
    "strings"
)

func main() {
    userRoles := map[string]string{
        "alice": "admin",
        "bob":   "editor",
        "eve":   "viewer",
    }
    
    usernames := maps.Keys(userRoles)
    for _, username := range usernames {
        fmt.Println("Processing user:", strings.ToUpper(username))
    }
}

我们从用户角色 Map 中提取用户名并处理每个用户名。在迭代过程中,键将被转换为大写。

对提取的键进行排序

由于 Map 的键是无序的,我们经常对其进行排序。此示例展示了如何在提取后对键进行排序。

sorted_keys.go
package main

import (
    "fmt"
    "maps"
    "slices"
)

func main() {
    countryPopulations := map[string]int{
        "China":  1439,
        "India":  1380,
        "USA":    331,
        "Brazil": 213,
    }
    
    countries := maps.Keys(countryPopulations)
    slices.Sort(countries)
    
    fmt.Println("Countries sorted alphabetically:")
    for _, country := range countries {
        fmt.Println(country)
    }
}

使用 maps.Keys 获取国家名称后,我们使用 slices.Sort 对其进行排序。输出显示按字母顺序排列的国家。

使用自定义类型

maps.Keys 可用于键使用自定义类型的 Map。此示例使用结构体键进行演示。

custom_type_keys.go
package main

import (
    "fmt"
    "maps"
)

type Coordinate struct {
    X, Y int
}

func main() {
    gridValues := map[Coordinate]string{
        {1, 1}: "start",
        {2, 3}: "treasure",
        {4, 2}: "enemy",
    }
    
    coordinates := maps.Keys(gridValues)
    fmt.Println("Map coordinates:", coordinates)
}

我们创建了一个带有 Coordinate 结构体键的 Map 并提取了它们。只要自定义类型是有效的 Map 键类型,该函数就能处理它们。

实际示例:键验证

这个实际示例在提取后验证 Map 键。我们检查所有键是否满足特定标准。

key_validation.go
package main

import (
    "fmt"
    "maps"
    "slices"
    "strings"
)

func main() {
    config := map[string]string{
        "timeout":  "30s",
        "retries":  "3",
        "endpoint": "https://api.example.com",
    }
    
    keys := maps.Keys(config)
    
    allValid := slices.All(keys, func(key string) bool {
        return len(key) > 0 && !strings.ContainsAny(key, " \t\n")
    })
    
    if allValid {
        fmt.Println("All config keys are valid")
    } else {
        fmt.Println("Invalid keys found in config")
    }
}

我们提取配置键并进行验证。检查确保键不为空且不包含空格字符。

来源

Go 实验性 maps 包文档

本教程通过提取和处理各种场景下的 Map 键的实际示例,介绍了 Go 中的 maps.Keys 函数。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年起撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Go 教程