Golang slices.All
最后修改于 2025 年 4 月 20 日
本教程将解释如何在 Go 中使用 slices.All 函数。我们将通过实际示例介绍切片操作和条件检查。
slices.All 函数用于测试切片中的所有元素是否都满足给定条件。它是 Go 实验性 slices 包的一部分。
此函数对于验证数据或检查集合中所有元素的属性非常有用。仅当所有元素都通过测试时,它才会返回 true。
基本的 slices.All 示例
slices.All 最简单的用法是检查切片中的所有数字是否都是正数。我们定义一个测试函数并将其应用于每个元素。
package main
import (
"fmt"
"slices"
)
func main() {
numbers := []int{1, 2, 3, 4, 5}
allPositive := slices.All(numbers, func(n int) bool {
return n > 0
})
fmt.Println("All numbers positive:", allPositive)
}
我们创建一个正数切片,并检查所有元素是否都大于零。匿名函数为每个元素定义了我们的条件。
检查字符串属性
slices.All 可以验证字符串元素的属性。此示例检查切片中的所有字符串长度是否都大于 3。
package main
import (
"fmt"
"slices"
)
func main() {
words := []string{"apple", "banana", "cherry"}
allLong := slices.All(words, func(s string) bool {
return len(s) > 3
})
fmt.Println("All words longer than 3 chars:", allLong)
}
测试函数会检查每个字符串的长度。由于所有单词都满足条件,因此函数返回 true。
使用结构体
我们可以将 slices.All 与自定义结构体类型一起使用。此示例检查切片中的所有人是否都是成年人。
package main
import (
"fmt"
"slices"
)
type Person struct {
Name string
Age int
}
func main() {
people := []Person{
{"Alice", 25},
{"Bob", 30},
{"Charlie", 17},
}
allAdults := slices.All(people, func(p Person) bool {
return p.Age >= 18
})
fmt.Println("All adults:", allAdults)
}
函数检查每个人的年龄字段。由于 Charlie 未满 18 岁,结果为 false。
组合多个条件
可以在测试函数中组合复杂的条件。此示例检查所有数字是否都是偶数且为正数。
package main
import (
"fmt"
"slices"
)
func main() {
numbers := []int{2, 4, 6, 8, 10}
allValid := slices.All(numbers, func(n int) bool {
return n > 0 && n%2 == 0
})
fmt.Println("All numbers even and positive:", allValid)
}
该条件使用逻辑 AND 组合了两个检查。所有数字都满足这两个条件,因此结果为 true。
空切片行为
slices.All 对空切片有特殊的行为。此示例演示了它如何始终为空切片返回 true。
package main
import (
"fmt"
"slices"
)
func main() {
var empty []int
result := slices.All(empty, func(n int) bool {
return n > 100 // Condition doesn't matter
})
fmt.Println("Result for empty slice:", result)
}
由于没有需要检查的元素,该函数会空泛地返回 true。这种行为遵循数学上全称量词的逻辑。
性能注意事项
对于大型切片,测试函数的性能很重要。此示例对不同的方法进行了基准测试。
package main
import (
"fmt"
"slices"
"time"
)
func main() {
largeSlice := make([]int, 1_000_000)
for i := range largeSlice {
largeSlice[i] = i
}
// Simple condition
start := time.Now()
_ = slices.All(largeSlice, func(n int) bool {
return n >= 0
})
fmt.Println("Simple condition:", time.Since(start))
// Complex condition
start = time.Now()
_ = slices.All(largeSlice, func(n int) bool {
return n >= 0 && n%2 == 0 && n < 1_000_000
})
fmt.Println("Complex condition:", time.Since(start))
}
执行时间取决于条件的复杂性和提前终止。slices.All 为了效率会在第一个不满足条件的元素处停止。
实际示例:输入验证
此实际示例使用 slices.All 来验证用户输入。我们检查所有提供的数字是否都在可接受的范围内。
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
}
allValid := slices.All(numbers, func(n int) bool {
return n >= 0 && n <= 100
})
if allValid {
fmt.Println("All inputs are valid percentages")
} else {
fmt.Println("Some inputs are outside 0-100 range")
}
}
我们将字符串转换为整数,然后验证所有值是否在 0 到 100 之间。转换和验证的结合展示了实际用法。
来源
本教程通过实际示例,介绍了 Go 中的 slices.All 函数,以及在各种场景下对切片元素进行条件检查。