ZetCode

Go 谓词

最后修改于 2025 年 5 月 4 日

在本文中,我们将演示如何在 Golang 中有效地使用谓词。谓词是用于以简洁而富有表现力的方式过滤数据和实现条件逻辑的强大工具。

谓词 是一个评估为 true 或 false 的语句。在编程中,谓词是返回布尔值的单参数函数。它们使开发人员能够为各种操作编写清晰有效的逻辑。

Go 简单谓词示例

以下示例说明了一个简单的谓词。它从切片中过滤出正数并将其存储在另一个切片中。这种方法有助于根据条件隔离特定数据。

main.go
package main

import (
    "fmt"
)

func isPositive(val int) bool {

    if val > 0 {

        return true
    } else {

        return false
    }
}

func main() {

    vals := []int{-2, 0, 4, 3, 1, 9, 7, -3, -5, 6}
    vals2 := []int{}

    for _, val := range vals {

        if isPositive(val) {

            vals2 = append(vals2, val)
        }
    }

    fmt.Println(vals)
    fmt.Println(vals2)
}

该示例从切片中提取所有正数并将其存储在另一个切片中。这说明了谓词在根据特定标准过滤数据方面的实用性。

func isPositive(val int) bool {

    if val > 0 {

        return true
    } else {

        return false
    }
}

isPositive 函数是一个谓词。它返回一个布尔值,指示给定值是否为正。此函数简化了检查集合中单个元素的条件的过程。

for _, val := range vals {

    if isPositive(val) {

        vals2 = append(vals2, val)
    }
}

我们遍历值切片并将谓词应用于每个元素。这使我们能够选择性地处理满足指定条件的元素。

$ go run main.go
[-2 0 4 3 1 9 7 -3 -5 6]
[4 3 1 9 7 6]

Go any 函数

any 函数遍历集合的元素,如果谓词对至少一个元素有效,则返回 true。此函数对于检查满足给定条件的元素是否存在很有用。

main.go
package main

import (
    "fmt"
    "strings"
)

func any(data []string, f func(string) bool) bool {

    for _, v := range data {

        if f(v) {
            return true
        }
    }

    return false
}

func main() {

    words := []string{"falcon", "war", "sun", "cup", "rock"}

    w := "e"
    r := any(words, func(s string) bool {

        return strings.Contains(s, w)
    })

    if r {

        fmt.Printf("The slice contains an element with %s\n", w)
    } else {

        fmt.Printf("The slice does not contain an element with %s\n", w)
    }
}

在示例中,我们使用 any 函数检查 words 切片中至少有一个单词包含字母“w”。这说明了如何将谓词与高阶函数结合使用以进行灵活的数据处理。

func any(data []string, f func(string) bool) bool {

    for _, v := range data {

        if f(v) {
            return true
        }
    }

    return false
}

any 函数以切片和谓词作为参数。它遍历切片并为每个元素评估谓词,如果任何元素满足条件,则返回 true。

r := any(words, func(s string) bool {

    return strings.Contains(s, w)
})

此示例中的谓词是使用 strings.Contains 函数的匿名函数。这种方法允许动态和定制的条件检查。

$ go run main.go
The slice does not contain an element with e

Go all 函数

all 函数遍历集合的元素,如果谓词对所有元素都有效,则返回 true。此函数对于验证集合中的每个元素是否都满足特定条件很有用。

main.go
package main

import "fmt"

func all(data []string, f func(string) bool) bool {

    for _, e := range data {

        if !f(e) {

            return false
        }
    }

    return true
}

func main() {

    words := []string{"war", "water", "cup", "tree", "storm"}
    n := 3

    res := all(words, func(s string) bool {

        return len(s) >= n
    })

    if res {

        fmt.Printf("All words have %d+ characters", n)
    } else {

        fmt.Printf("It is not true that all words have %d+ characters", n)
    }
}

在示例中,我们使用 all 函数来检查集合中的所有单词的长度是否都大于或等于 n 个字符。这说明了谓词如何强制对数据集进行统一的条件。

$ go run main.go
All words have 3+ characters

Go filter 函数

filter 函数返回一个新集合,其中仅包含原始集合中给定谓词返回 true 的元素。此函数非常适合根据特定标准提取数据子集。

main.go
package main

import (
    "fmt"
    "strings"
)

func filter(data []string, f func(string) bool) []string {

    fltd := make([]string, 0)

    for _, e := range data {

        if f(e) {
            fltd = append(fltd, e)
        }
    }

    return fltd
}

func main() {

    words := []string{"war", "water", "cup", "tree", "storm"}

    p := "w"

    res := filter(words, func(s string) bool {

        return strings.HasPrefix(s, p)
    })

    fmt.Println(res)
}

该示例使用 filter 函数查找所有以字母“w”开头的单词。这展示了谓词有效细化数据集合的能力。

func filter(data []string, f func(string) bool) []string {

    fltd := make([]string, 0)

    for _, e := range data {

        if f(e) {
            fltd = append(fltd, e)
        }
    }

    return fltd
}

filter 函数以集合和谓词作为参数。它创建一个新切片,并将所有满足谓词的元素追加到其中。这种方法确保原始数据保持不变,同时生成过滤后的结果。

$ go run main.go
[war water]

来源

The Go Programming Language Specification

在本文中,我们涵盖了 Golang 中的谓词。谓词是多功能且强大的工具,使开发人员能够编写简洁而富有表现力的代码来执行过滤和条件操作。通过掌握谓词,您可以创建更高效、更易读的代码。

作者

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

列出所有 Go 教程