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 中的 min 函数。