ZetCode

Golang slices.Max

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 slices.Max 函数。我们将通过实际示例来讲解如何在切片中查找最大元素。

slices.Max 函数返回切片中的最大元素。它是 Go 实验性 slices 包的一部分,可用于有序类型。

此函数可用于查找集合中的最大值。如果切片为空,它会引发 panic,因此在使用前请务必检查长度。

基本的 slices.Max 示例

slices.Max 最简单的用法是查找切片中的最大数字。我们将切片直接传递给函数。

basic_max.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    numbers := []int{3, 5, 1, 8, 2}
    
    maxNum := slices.Max(numbers)
    
    fmt.Println("Maximum number:", maxNum)
}

我们创建一个整数切片并找到最大值。该函数返回 8,这是切片中最大的数字。

查找最大字符串

slices.Max 还可以查找切片中的最大字符串。字符串是按字典顺序比较的。

string_max.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    fruits := []string{"apple", "banana", "cherry", "date"}
    
    maxFruit := slices.Max(fruits)
    
    fmt.Println("Lexicographically last fruit:", maxFruit)
}

该函数按字母顺序比较字符串。返回 "date",因为它在给定的水果中按字典顺序排在最后。

使用结构体

我们可以将 slices.MaxFunc 用于自定义结构体类型。此示例查找切片中最年长的人。

struct_max.go
package main

import (
    "cmp"
    "fmt"
    "slices"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    people := []Person{
        {"Alice", 25},
        {"Bob", 30},
        {"Charlie", 20},
    }
    
    oldest := slices.MaxFunc(people, func(a, b Person) int {
        return cmp.Compare(a.Age, b.Age)
    })
    
    fmt.Println("Oldest person:", oldest)
}

我们将 slices.MaxFunc 与自定义比较函数一起使用。该函数返回 Bob,因为他的年龄值最高。

处理空切片

当在空切片上调用 slices.Max 时,它会引发 panic。此示例显示了如何安全地处理空切片。

empty_slice.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    var empty []int
    
    if len(empty) == 0 {
        fmt.Println("Slice is empty, cannot find maximum")
        return
    }
    
    // This would panic if uncommented:
    // max := slices.Max(empty)
    // fmt.Println(max)
}

在调用 slices.Max 之前,请务必检查切片长度。该示例演示了正确的空切片处理方法。

查找最大浮点数

此示例演示了如何查找切片中的最大浮点数值。浮点数按其数值大小进行比较。

float_max.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    temperatures := []float64{36.6, 37.2, 35.8, 38.1, 36.9}
    
    maxTemp := slices.Max(temperatures)
    
    fmt.Printf("Highest temperature: %.1f\n", maxTemp)
}

该函数正确识别 38.1 为最大温度。浮点数比较遵循标准的 IEEE 754 规则。

使用 MaxFunc 进行自定义比较

slices.MaxFunc 允许自定义比较逻辑。此示例查找切片中最长的字符串。

custom_max.go
package main

import (
    "cmp"
    "fmt"
    "slices"
)

func main() {
    words := []string{"short", "medium length", "very long string", "tiny"}
    
    longest := slices.MaxFunc(words, func(a, b string) int {
        return cmp.Compare(len(a), len(b))
    })
    
    fmt.Println("Longest string:", longest)
}

我们按长度而不是按字典顺序比较字符串。该函数返回 "very long string",因为它包含的字符最多。

实际示例:考试成绩

这个实际示例查找测试结果切片中的最高分数。它展示了 slices.Max 的实际用法。

exam_scores.go
package main

import (
    "fmt"
    "slices"
)

func main() {
    scores := []int{85, 92, 78, 95, 88, 91}
    
    if len(scores) == 0 {
        fmt.Println("No scores available")
        return
    }
    
    topScore := slices.Max(scores)
    
    fmt.Printf("The highest exam score is %d/100\n", topScore)
}

我们首先检查切片是否为空以避免 panic。然后我们查找并显示测试结果中的最高分数。

来源

Go 实验性切片包文档

本教程通过在各种场景下查找最大元素的实际示例,介绍了 Go 中的 slices.Max 函数。

作者

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

列出所有 Go 教程