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