Golang slices.MinFunc
最后修改于 2025 年 4 月 20 日
本教程将解释如何在 Go 中使用 slices.MinFunc
函数。我们将介绍如何使用自定义比较函数查找最小元素。
slices.MinFunc
函数根据自定义比较函数返回切片中的最小元素。它是 Go 实验性 slices 包的一部分。
当您需要根据自定义排序规则或复杂数据类型查找最小值时,此函数非常有用。它返回找到的第一个最小值。
基本的 slices.MinFunc 示例
slices.MinFunc
最简单的用法是查找切片中最小的数字。我们定义一个返回 -1、0 或 1 的比较函数。
package main import ( "fmt" "slices" ) func main() { numbers := []int{3, 1, 4, 1, 5, 9} min := slices.MinFunc(numbers, func(a, b int) int { if a < b { return -1 } else if a > b { return 1 } return 0 }) fmt.Println("Minimum number:", min) }
我们创建一个数字切片并使用标准比较查找最小值。该函数为切片中的最小元素返回 1。
查找最小字符串长度
slices.MinFunc
可以查找长度最小的字符串。此示例通过字符串长度而不是字典顺序进行比较。
package main import ( "fmt" "slices" ) func main() { words := []string{"apple", "banana", "cherry", "date"} shortest := slices.MinFunc(words, func(a, b string) int { if len(a) < len(b) { return -1 } else if len(a) > len(b) { return 1 } return 0 }) fmt.Println("Shortest word:", shortest) }
比较函数检查字符串长度而不是其内容。返回“Date”作为最短字符串,长度为 4 个字符。
使用结构体
我们可以将 slices.MinFunc
与自定义结构体类型一起使用。此示例查找切片中最年轻的人。
package main import ( "fmt" "slices" ) type Person struct { Name string Age int } func main() { people := []Person{ {"Alice", 25}, {"Bob", 30}, {"Charlie", 17}, } youngest := slices.MinFunc(people, func(a, b Person) int { if a.Age < b.Age { return -1 } else if a.Age > b.Age { return 1 } return 0 }) fmt.Println("Youngest person:", youngest.Name) }
该函数比较每个 Person 结构体的 Age 字段。Charlie 以 17 岁被返回为最年轻的人。
不区分大小写的字符串比较
此示例演示了在比较中忽略大小写差异的同时查找最小字符串。
package main import ( "fmt" "slices" "strings" ) func main() { words := []string{"Apple", "banana", "cherry", "aardvark"} min := slices.MinFunc(words, func(a, b string) int { aLower := strings.ToLower(a) bLower := strings.ToLower(b) if aLower < bLower { return -1 } else if aLower > bLower { return 1 } return 0 }) fmt.Println("First in alphabetical order:", min) }
比较在比较之前将字符串转换为小写。尽管有原始大小写,“aardvark”仍被返回为最小值。
空切片行为
使用空切片调用 slices.MinFunc
时会引发 panic。此示例演示了正确的错误处理。
package main import ( "fmt" "slices" ) func main() { var empty []int defer func() { if r := recover(); r != nil { fmt.Println("Recovered from panic:", r) } }() // This will panic _ = slices.MinFunc(empty, func(a, b int) int { if a < b { return -1 } else if a > b { return 1 } return 0 }) }
函数会 panic,因为空切片中没有有效的最小值。在生产代码中调用 MinFunc 之前,请务必检查切片长度。
按绝对值查找最小值
此示例查找绝对值最小的数字,展示了自定义数学比较。
package main import ( "fmt" "math" "slices" ) func main() { numbers := []int{-5, 2, -1, 3, -2} minAbs := slices.MinFunc(numbers, func(a, b int) int { absA := math.Abs(float64(a)) absB := math.Abs(float64(b)) if absA < absB { return -1 } else if absA > absB { return 1 } return 0 }) fmt.Println("Number with smallest absolute value:", minAbs) }
比较函数使用绝对值而不是数字本身。-1 被返回为具有最小绝对值(1)。
实际示例:查找最便宜的产品
这个实际示例使用 slices.MinFunc
和自定义比较来查找切片中最便宜的产品。
package main import ( "fmt" "slices" ) type Product struct { Name string Price float64 } func main() { products := []Product{ {"Laptop", 999.99}, {"Phone", 699.99}, {"Tablet", 299.99}, {"Monitor", 199.99}, } cheapest := slices.MinFunc(products, func(a, b Product) int { if a.Price < b.Price { return -1 } else if a.Price > b.Price { return 1 } return 0 }) fmt.Printf("Cheapest product: %s ($%.2f)\n", cheapest.Name, cheapest.Price) }
我们按 Price 字段比较 Product 结构体。Monitor 以 $199.99 的价格被返回为最便宜的产品。
来源
本教程介绍了 Go 中的 slices.MinFunc
函数,并通过使用自定义比较函数查找最小元素的实际示例进行了说明。