ZetCode

Golang slices.ContainsFunc

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 slices.ContainsFunc 函数。我们将通过实际示例介绍切片操作,重点是检查元素。

slices.ContainsFunc 函数用于测试切片是否包含满足给定条件的任何元素。它是 Go 实验性 slices 包的一部分。

此函数对于在集合中搜索具有特定属性的元素很有用。如果至少有一个元素通过测试,它将返回 true。

基本 slices.ContainsFunc 示例

slices.ContainsFunc 最简单的用法是检查切片是否包含任何负数。我们定义一个函数来识别负值。

basic_contains.go
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 可以验证字符串元素的属性。此示例检查切片中的任何字符串是否以特定前缀开头。

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

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},
    }
    
    hasMinor := slices.ContainsFunc(people, func(p Person) bool {
        return p.Age < 18
    })
    
    fmt.Println("Contains minor:", hasMinor)
}

该函数检查每个人的年龄字段。由于 Charlie 未满 18 岁,因此结果为 true。

组合多个条件

可以在测试函数中组合复杂条件。此示例检查任何数字是否既是偶数又是负数。

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

empty_slice.go
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。此行为遵循存在量词的数学逻辑。

性能注意事项

对于大型切片,测试函数的性能很重要。此示例显示了函数如何在第一次匹配时停止。

performance.go
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 验证用户输入。我们检查提供的任何数字是否超出了可接受的范围。

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

本教程通过在各种场景中搜索元素的实际示例,涵盖了 Go 中的 slices.ContainsFunc 函数。

作者

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

列出所有 Go 教程