ZetCode

Golang min 函数

最后修改时间 2025 年 5 月 8 日

本教程将解释如何在 Go 中使用内置的 min 函数。我们将通过查找最小值来涵盖基本用法和实际示例。

min 函数返回其参数中最小的值。它作为比较有序值的新内置函数之一在 Go 1.21 中引入。该函数适用于数字类型和字符串。

在 Go 中,min 比较相同类型的值并返回最小值。它可以接受两个或多个参数。如果调用时没有参数或参数类型不兼容,该函数将引发 panic。

整数的基本 min

min 最简单的用法是找出两个整数中较小的一个。此示例演示了基本的整数比较。
注意:所有参数必须是同一类型。

basic_min.go
package main

import "fmt"

func main() {
    a := 42
    b := 27
    
    smallest := min(a, b)
    fmt.Println("The smallest value is:", smallest)
    
    // With more than two values
    fmt.Println("Minimum of 5 values:", min(12, 8, 23, 5, 17))
}

该函数返回 27,因为它比 42 小。对于多个值,它会找到总体最小值(第二个示例中的 5)。

浮点数的 min

min 函数与浮点数的工作方式与整数类似。此示例显示了浮点数比较。

float_min.go
package main

import "fmt"

func main() {
    x := 3.14
    y := 2.71
    z := 1.618
    
    smallest := min(x, y, z)
    fmt.Printf("The smallest float is: %.2f\n", smallest)
    
    // Edge case with negative infinity
    fmt.Println("Min with -Inf:", min(1.5, -1.0/0.0, 2.5))
}

该函数正确地将 1.618 识别为最小值。它还可以正确处理负无穷大等特殊情况。

字符串的 min

min 函数可以按字典顺序比较字符串。此示例演示了使用 min 进行字符串比较。

string_min.go
package main

import "fmt"

func main() {
    s1 := "apple"
    s2 := "banana"
    s3 := "apricot"
    
    first := min(s1, s2, s3)
    fmt.Println("Lexicographically first:", first)
    
    // Case sensitivity matters
    fmt.Println("Min with mixed case:", min("Go", "go", "GO"))
}

该函数返回 "apple",因为它按字典顺序比 "apricot" 和 "banana" 小。请注意,比较是区分大小写的。

自定义类型的 min

对于自定义类型,min 要求该类型实现有序约束。此示例显示了带类型参数的 min。

custom_min.go
package main

import (
    "fmt"
    "golang.org/x/exp/constraints"
)

type Temperature float64

func findMin[T constraints.Ordered](values ...T) T {
    return min(values...)
}

func main() {
    temps := []Temperature{22.5, 18.3, 25.0, 16.7}
    
    minTemp := findMin(temps...)
    fmt.Printf("Minimum temperature: %.1f°C\n", minTemp)
    
    // Works with other ordered types
    fmt.Println("Min duration:", findMin(3*time.Hour, 90*time.Minute))
}

泛型 findMin 函数内部使用 min。它可以与满足 Ordered 约束的任何类型一起使用。

实际场景中的 min

此示例显示了 min 在计算统计数据同时防止除零的函数中的实际应用。

practical_min.go
package main

import (
    "fmt"
    "math"
)

func safeDivide(a, b float64) float64 {
    minDenominator := min(math.Abs(b), 1.0)
    if minDenominator == 0 {
        return math.Inf(1)
    }
    return a / minDenominator
}

func main() {
    fmt.Println("Safe division (5/0):", safeDivide(5, 0))
    fmt.Println("Safe division (5/0.5):", safeDivide(5, 0.5))
    fmt.Println("Safe division (5/-2):", safeDivide(5, -2))
    
    // Another practical example
    fmt.Println("Clamping value:", min(max(15, 10), 20))
}

在这里,min 确保分母的绝对值永远不会小于 1.0。这可以防止除以非常小的数字,这些数字可能导致浮点数溢出。

来源

Go 语言规范

本教程通过查找不同类型最小值的实际示例,介绍了 Go 中的 min 函数。

作者

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

列出所有 Golang 教程