Golang maps.Keys
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在 Go 中使用 maps.Keys 函数。我们将通过提取键的实际示例来讲解 Map 操作。
maps.Keys 函数返回一个包含 Map 中所有键的切片。它是 Go 实验性 maps 包的一部分。
当您需要单独处理 Map 的键时,例如进行迭代或进一步处理,此函数非常有用。键的顺序不保证。
基本的 maps.Keys 示例
maps.Keys 最简单的用法是从字符串到整数的 Map 中提取键。我们创建一个 Map 并将其所有键获取到一个切片中。
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 中获取键。
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 上的行为。
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 键。此示例演示了在提取键后如何处理每个键。
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 的键是无序的,我们经常对其进行排序。此示例展示了如何在提取后对键进行排序。
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。此示例使用结构体键进行演示。
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 键。我们检查所有键是否满足特定标准。
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")
}
}
我们提取配置键并进行验证。检查确保键不为空且不包含空格字符。
来源
本教程通过提取和处理各种场景下的 Map 键的实际示例,介绍了 Go 中的 maps.Keys 函数。