开放的编程资料库

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

如何在Golang中创建和使用filter和map函数

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

未经允许不得转载:我爱分享网 » 如何在Golang中创建和使用filter和map函数

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

赞(0) 打赏