Golang slices.ContainsFunc
最后修改于 2025 年 4 月 20 日
本教程解释了如何在 Go 中使用 slices.ContainsFunc 函数。我们将通过实际示例介绍切片操作,重点是检查元素。
slices.ContainsFunc 函数用于测试切片是否包含满足给定条件的任何元素。它是 Go 实验性 slices 包的一部分。
此函数对于在集合中搜索具有特定属性的元素很有用。如果至少有一个元素通过测试,它将返回 true。
基本 slices.ContainsFunc 示例
slices.ContainsFunc 最简单的用法是检查切片是否包含任何负数。我们定义一个函数来识别负值。
package main
import (
"fmt"
"slices"
)
func main() {
numbers := []int{1, 2, -3, 4, 5}
hasNegative := slices.ContainsFunc(numbers, func(n int) bool {
return n < 0
})
fmt.Println("Contains negative number:", hasNegative)
}
我们创建一个包含一个负数的切片并检查其是否存在。匿名函数定义了我们识别负值的条件。
检查字符串属性
slices.ContainsFunc 可以验证字符串元素的属性。此示例检查切片中的任何字符串是否以特定前缀开头。
package main
import (
"fmt"
"slices"
"strings"
)
func main() {
words := []string{"apple", "banana", "cherry"}
hasPrefix := slices.ContainsFunc(words, func(s string) bool {
return strings.HasPrefix(s, "ban")
})
fmt.Println("Contains word starting with 'ban':", hasPrefix)
}
测试函数使用 strings.HasPrefix 来检查每个字符串。由于“banana”满足条件,因此函数返回 true。
使用结构体
我们可以将 slices.ContainsFunc 与自定义结构体类型一起使用。此示例检查切片中的任何人是否未成年。
package main
import (
"fmt"
"slices"
)
type Person struct {
Name string
Age int
}
func main() {
people := []Person{
{"Alice", 25},
{"Bob", 30},
{"Charlie", 17},
}
hasMinor := slices.ContainsFunc(people, func(p Person) bool {
return p.Age < 18
})
fmt.Println("Contains minor:", hasMinor)
}
该函数检查每个人的年龄字段。由于 Charlie 未满 18 岁,因此结果为 true。
组合多个条件
可以在测试函数中组合复杂条件。此示例检查任何数字是否既是偶数又是负数。
package main
import (
"fmt"
"slices"
)
func main() {
numbers := []int{2, -4, 6, -8, 10}
hasEvenNegative := slices.ContainsFunc(numbers, func(n int) bool {
return n < 0 && n%2 == 0
})
fmt.Println("Contains even negative number:", hasEvenNegative)
}
该条件使用逻辑 AND 组合了两个检查。切片包含 -4 和 -8,它们同时满足这两个条件,因此结果为 true。
空切片行为
slices.ContainsFunc 对空切片有特殊行为。此示例演示了它如何始终为 N=空切片返回 false。
package main
import (
"fmt"
"slices"
)
func main() {
var empty []int
result := slices.ContainsFunc(empty, func(n int) bool {
return n > 100 // Condition doesn't matter
})
fmt.Println("Result for empty slice:", result)
}
由于没有元素可供检查,因此函数返回 false。此行为遵循存在量词的数学逻辑。
性能注意事项
对于大型切片,测试函数的性能很重要。此示例显示了函数如何在第一次匹配时停止。
package main
import (
"fmt"
"slices"
"time"
)
func main() {
largeSlice := make([]int, 1_000_000)
for i := range largeSlice {
largeSlice[i] = i
}
largeSlice[999_999] = -1 // Add negative at end
// Search for negative number
start := time.Now()
found := slices.ContainsFunc(largeSlice, func(n int) bool {
return n < 0
})
elapsed := time.Since(start)
fmt.Printf("Found negative: %v (took %v)\n", found, elapsed)
}
执行时间取决于匹配元素的the position。 slices.ContainsFunc 在第一个 true 条件处停止。
实际示例:输入验证
这个实际示例使用 slices.ContainsFunc 验证用户输入。我们检查提供的任何数字是否超出了可接受的范围。
package main
import (
"fmt"
"slices"
"strconv"
)
func main() {
inputs := []string{"42", "15", "99", "101"}
numbers := make([]int, len(inputs))
for i, s := range inputs {
num, err := strconv.Atoi(s)
if err != nil {
fmt.Println("Invalid input:", s)
return
}
numbers[i] = num
}
hasInvalid := slices.ContainsFunc(numbers, func(n int) bool {
return n < 0 || n > 100
})
if hasInvalid {
fmt.Println("Contains invalid percentage (outside 0-100 range)")
} else {
fmt.Println("All inputs are valid percentages")
}
}
我们将字符串转换为整数,然后检查是否有任何值超出 0-100 的范围。转换和验证的组合展示了实际用法。
来源
本教程通过在各种场景中搜索元素的实际示例,涵盖了 Go 中的 slices.ContainsFunc 函数。