Gofilter/map教程展示了如何在Golang中创建和使用filter和map函数。
过滤器函数处理一个集合并生成一个新集合,该集合恰好包含给定谓词返回true的那些元素。
映射函数将给定函数应用于集合的每个元素,并在新集合中返回结果。
谓词是一个返回布尔值的单参数函数。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
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]
在下一个例子中,我们过滤了一片结构类型。
package main
import "fmt"
type User struct {
name string
occupation string
country string
}
func filter(data []User, f func(User) bool) []User {
fltd := make([]User, 0)
for _, user := range data {
if f(user) {
fltd = append(fltd, user)
}
}
return fltd
}
func main() {
users := []User{
{"John Doe", "gardener", "USA"},
{"Roger Roe", "driver", "UK"},
{"Paul Smith", "programmer", "Canada"},
{"Lucia Mala", "teacher", "Slovakia"},
{"Patrick Connor", "shopkeeper", "USA"},
{"Tim Welson", "programmer", "Canada"},
{"Tomas Smutny", "programmer", "Slovakia"},
}
country := "Slovakia"
res := filter(users, func(u User) bool {
return u.country == country
})
fmt.Println(res)
}
该示例过滤了居住在斯洛伐克的所有用户。
$ go run main.go
[{Lucia Mala teacher Slovakia} {Tomas Smutny programmer Slovakia}]
Go过滤器通用示例
在下面的示例中,我们创建了过滤器函数的通用版本。
package main
import (
"fmt"
"strings"
)
func filter[T any](data []T, f func(T) bool) []T {
fltd := make([]T, 0, len(data))
for _, e := range data {
if f(e) {
fltd = append(fltd, e)
}
}
return fltd
}
func main() {
words := []string{"war", "cup", "water", "tree", "storm"}
res := filter(words, func(s string) bool {
return strings.HasPrefix(s, "w")
})
fmt.Println(res)
vals := []int{-1, 0, 2, 5, -9, 3, 4, 7}
res2 := filter(vals, func(e int) bool {
return e > 0
})
fmt.Println(res2)
}
我们有一个通用版本的过滤器功能。我们用它来过滤字符串和整数。
$ go run main.go [war water] [2 5 3 4 7]
Go地图示例
在下面的例子中,我们转换了一个整数切片。请注意,我们无法命名函数map,因为它是用于创建字典/映射的Go关键字。
package main
import (
"fmt"
)
func map2(data []int, f func(int) int) []int {
mapped := make([]int, len(data))
for i, e := range data {
mapped[i] = f(e)
}
return mapped
}
func main() {
vals := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
res := map2(vals, func(i int) int {
return i * i
})
fmt.Println(res)
}
我们有一个整数片段。我们对切片的所有元素进行平方。
$ go run main.go [1 4 9 16 25 36 49 64 81 100]
在下一个示例中,我们在一段字符串上应用映射函数。
package main
import (
"fmt"
"strings"
)
func map2(data []string, f func(string) string) []string {
mapped := make([]string, len(data))
for i, e := range data {
mapped[i] = f(e)
}
return mapped
}
func main() {
words := []string{"war", "water", "cup", "tree", "storm"}
res := map2(words, strings.ToUpper)
fmt.Println(res)
}
该示例将一段字符串转换为大写。
$ go run main.go [WAR WATER CUP TREE STORM]
Gomap通用示例
在下面的示例中,我们有一个通用版本的map函数。
package main
import (
"fmt"
"strconv"
"strings"
)
func map2[T, U any](data []T, f func(T) U) []U {
res := make([]U, 0, len(data))
for _, e := range data {
res = append(res, f(e))
}
return res
}
func main() {
words := []string{"war", "cup", "water", "tree", "storm"}
result := map2(words, func(s string) string {
return strings.ToUpper(s)
})
fmt.Println(result)
fmt.Println("-------------------")
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
squares := map2(numbers, func(n int) int {
return n * n
})
fmt.Println(squares)
fmt.Println("-------------------")
as_strings := map2(numbers, func(n int) string {
return strconv.Itoa(n)
})
fmt.Printf("%q", as_strings)
}
使用map函数,我们可以处理整数和字符串。
$ go run main.go [WAR CUP WATER TREE STORM] ------------------- [1 4 9 16 25 36 49 64 81 100] ------------------- ["1" "2" "3" "4" "5" "6" "7" "8" "9" "10"]
在本教程中,我们使用了Golang中的过滤器和映射函数。
列出所有Go教程。
