开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

Go谓词

Go谓词教程展示了如何在Golang中使用谓词。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

一般意义上的谓词是关于某事的陈述,要么是真的,要么是假的。在编程中,谓词表示返回布尔值的单参数函数。

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]

去任何函数

any(也称为exists)函数迭代集合的元素,如果谓词对至少一个元素有效,则返回true。

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是一个将切片和谓词作为参数的函数。

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

执行所有函数

all函数迭代集合的元素并在谓词对所有元素都有效时返回true。

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

去过滤函数

过滤器函数返回一个新集合,其中仅包含给定谓词返回true的集合元素。

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函数将集合和谓词作为参数。它创建一个新的fltd切片,我们将所有满足传递的谓词函数的元素附加到其中。

$ go run main.go
[war water]

在本教程中,我们介绍了Golang中的谓词。

列出所有Go教程。

未经允许不得转载:我爱分享网 » Go谓词

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏