ZetCode

Golang maps.Values

最后修改日期:2025 年 4 月 27 日

本教程将介绍如何在 Go 中使用 maps.Values 函数。我们将通过实际示例,涵盖从 Map 中检索值的 Map 操作。

maps.Values 函数返回一个包含 Map 中所有值的切片。它是 Go 标准 maps 包的一部分,于 Go 1.21 引入。

此函数对于需要处理或分析 Map 中存储的所有值而无需其关联键的场景很有用。由于 Go 中的 Map 本身是无序的,因此返回的切片中值的顺序不保证。

基本 maps.Values 示例

maps.Values 最简单的用法是检索 Map 中的所有值。此示例从学生成绩 Map 中提取值。

basic_values.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    grades := map[string]int{
        "Alice": 85,
        "Bob":   90,
        "Charlie": 78,
    }
    
    values := maps.Values(grades)
    
    fmt.Println("All grades:", values)
}

我们创建一个 Map,将学生姓名作为键,他们的成绩作为值。maps.Values 返回一个包含所有成绩的整数切片。输出可能类似于 [85 90 78],但顺序不保证。

对 Map 值求和

maps.Values 可用于对 Map 值执行计算。此示例计算 Map 中所有值的总和。

sum_values.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    prices := map[string]int{
        "apple":  50,
        "banana": 30,
        "orange": 40,
    }
    
    values := maps.Values(prices)
    total := 0
    for _, v := range values {
        total += v
    }
    
    fmt.Println("Total price:", total)
}

该函数将所有价格检索为一个切片,我们对其进行迭代以计算总和。输出将是 Total price: 120

使用结构体值

maps.Values 可与包含结构体值的 Map 一起使用。此示例从员工 Map 中提取所有结构体值。

struct_values.go
package main

import (
    "fmt"
    "maps"
)

type Employee struct {
    Name   string
    Salary int
}

func main() {
    employees := map[string]Employee{
        "e1": {"Alice", 50000},
        "e2": {"Bob", 60000},
        "e3": {"Charlie", 55000},
    }
    
    values := maps.Values(employees)
    
    fmt.Println("All employees:")
    for _, emp := range values {
        fmt.Printf("%s: %d\n", emp.Name, emp.Salary)
    }
}

该函数返回一个 Employee 结构体切片,我们对其进行迭代以打印每个员工的详细信息。

过滤值

您可以处理 maps.Values 返回的切片来过滤值。此示例查找所有大于某个阈值的值。

filter_values.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    scores := map[string]int{
        "Alice":  95,
        "Bob":    85,
        "Charlie": 92,
        "Dave":   88,
    }
    
    values := maps.Values(scores)
    highScores := []int{}
    for _, score := range values {
        if score >= 90 {
            highScores = append(highScores, score)
        }
    }
    
    fmt.Println("High scores (90+):", highScores)
}

我们使用 maps.Values 获取所有分数,然后过滤出 90 分及以上的分数。输出可能类似于 High scores (90+): [95 92]

空映射行为

maps.Values 通过返回一个空切片来处理空 Map。此示例演示了这种行为。

empty_map.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    emptyMap := map[string]int{}
    
    values := maps.Values(emptyMap)
    
    fmt.Println("Values from empty map:", values)
    fmt.Println("Length of values:", len(values))
}

对于空 Map,maps.Values 返回一个空切片。输出将是 Values from empty map: []Length of values: 0

性能注意事项

maps.Values 的性能取决于 Map 的大小。此示例使用大型 Map 对该函数进行了基准测试。

performance.go
package main

import (
    "fmt"
    "maps"
    "time"
)

func main() {
    largeMap := make(map[string]int, 1_000_000)
    for i := 0; i < 1_000_000; i++ {
        largeMap[fmt.Sprintf("key%d", i)] = i
    }
    
    start := time.Now()
    values := maps.Values(largeMap)
    fmt.Println("Time to get values:", time.Since(start))
    fmt.Println("Number of values:", len(values))
}

该函数创建一个大型 Map 并测量检索所有值所需的时间。该操作通常是高效的,因为它只涉及一次 Map 遍历。

实际示例:数据分析

此实际示例使用 maps.Values 分析销售数据。我们计算 Map 中所有销售值的平均值。

data_analysis.go
package main

import (
    "fmt"
    "maps"
)

func main() {
    sales := map[string]float64{
        "Jan": 15000.50,
        "Feb": 18000.75,
        "Mar": 16500.25,
        "Apr": 17000.00,
    }
    
    values := maps.Values(sales)
    sum := 0.0
    for _, v := range values {
        sum += v
    }
    average := sum / float64(len(values))
    
    fmt.Printf("Average sales: %.2f\n", average)
}

我们使用 maps.Values 获取所有销售数据,对它们求和,然后计算平均值。输出将类似于 Average sales: 16625.38

来源

Go maps 包文档

本教程通过在各种场景下检索和处理 Map 值的实际示例,涵盖了 Go 中的 maps.Values 函数。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程