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教程。
