ZetCode

Golang slices.All

最后修改于 2025 年 4 月 20 日

本教程将解释如何在 Go 中使用 slices.All 函数。我们将通过实际示例介绍切片操作和条件检查。

slices.All 函数用于测试切片中的所有元素是否都满足给定条件。它是 Go 实验性 slices 包的一部分。

此函数对于验证数据或检查集合中所有元素的属性非常有用。仅当所有元素都通过测试时,它才会返回 true。

基本的 slices.All 示例

slices.All 最简单的用法是检查切片中的所有数字是否都是正数。我们定义一个测试函数并将其应用于每个元素。

basic_all.go
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。

string_check.go
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 与自定义结构体类型一起使用。此示例检查切片中的所有人是否都是成年人。

struct_check.go
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。

组合多个条件

可以在测试函数中组合复杂的条件。此示例检查所有数字是否都是偶数且为正数。

combined_conditions.go
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。

empty_slice.go
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。这种行为遵循数学上全称量词的逻辑。

性能注意事项

对于大型切片,测试函数的性能很重要。此示例对不同的方法进行了基准测试。

performance.go
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 来验证用户输入。我们检查所有提供的数字是否都在可接受的范围内。

input_validation.go
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 实验性切片包文档

本教程通过实际示例,介绍了 Go 中的 slices.All 函数,以及在各种场景下对切片元素进行条件检查。

作者

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

列出所有 Go 教程