首页 > 编程笔记 > Go语言笔记 阅读:2

Go语言匿名函数的用法(附带实例)

匿名函数是不需要定义函数名的函数,它可以简化代码,增强代码的可读性。

如果某个功能的业务逻辑比较简单,只在后续的代码块发挥作用,不需要重复使用,那么就可以把这个功能定义为匿名函数。对于业务逻辑比较复杂,需要重复使用的功能,则更适合定义为命名函数。通过定义匿名函数,避免了函数名冲突,便于为代码块添加功能。

在 Go语言中,匿名函数的定义主要由关键字 func、参数列表、返回类型和函数体几部分组成。语法格式如下:
func([参数 1, 参数 2, ...])(返回类型){
    函数体
}
匿名函数有 3 种使用方式:在定义时直接调用,将匿名函数赋值给变量,作为回调函数,下面分别介绍这 3 种使用方式。

Go语言定义时直接调用

在定义时直接调用是指在定义匿名函数的同时执行函数的调用。采用这种方式程序只能执行一次,无法实现函数的多次调用。代码如下:
package main

import "fmt"

func main() {
    // 定义匿名函数并直接调用
    func(m int, n int) {
        fmt.Print(m + n)
    }(10, 20)
}
运行结果如下:

30

在上述代码中,关键字 func 后面直接设置函数的参数,定义匿名函数后直接调用,并传递两个实参 10 和 20,这就是在定义匿名函数的同时直接调用函数的方式。

Go语言将匿名函数赋值给变量

使用匿名函数最常用的方式是把定义的匿名函数赋值给一个变量,后面的程序就可以通过变量调用匿名函数,这样在程序中可以多次调用匿名函数,而且这种方式使代码更易读。

例如,定义一个返回两个数字之和的匿名函数,代码如下:
package main

import "fmt"

func main() {
    // 定义匿名函数
    sum := func(m, n int) int {
        return m + n
    }
    result1 := sum(10, 20) // 调用匿名函数
    result2 := sum(30, 40) // 调用匿名函数
    fmt.Println("10 + 20 =", result1)
    fmt.Println("30 + 40 =", result2)
}
运行结果如下:

10 + 20 = 30
30 + 40 = 70

在上述代码中,将定义的匿名函数赋值给变量 sum,只要在 sum 后面使用小括号就可以调用匿名函数,而且可以多次调用。

【实例】编写一个判断某个整数是否能同时被 3 和 5 整除的匿名函数,在页面中输出 1000 以内所有能同时被 3 和 5 整除的正整数,要求每行显示 6 个数字。代码如下:
package main

import "fmt"

func main() {
    // 定义匿名函数
    getNum := func(num int) bool {
        // 判断是否能同时被 3 和 5 整除
        if num%3 == 0 && num%5 == 0 {
            return true
        } else {
            return false
        }
    }
    n := 0
    for i := 1; i <= 1000; i++ {
        if getNum(i) {
            n++
            fmt.Print(i, "\t")
            if n%6 == 0 {
                fmt.Print("\n")
            }
        }
    }
}
运行结果如下:
15  30  45  60  75  90
105 120 135 150 165 180
195 210 225 240 255 270
285 300 315 330 345 360
375 390 405 420 435 450
465 480 495 510 525 540
555 570 585 600 615 630
645 660 675 690 705 720
735 750 765 780 795 810
825 840 855 870 885 900
915 930 945 960 975 990

Go语言匿名函数作为回调函数

匿名函数的使用比较广泛,它本身相当于一个值,因此也可以作为回调函数进行一些操作。

例如,在遍历切片时,使用匿名函数实现获取中文字符串中的第一个字符,找出四句藏头诗中的暗藏文字,代码如下:
package main

import "fmt"

// 遍历切片,并调用参数指定的函数
func getText(list []string, f func(string)) {
    for _, v := range list {
        f(v)
    }
}

func main() {
    // 定义藏头诗
    poem := []string{"芦花丛中一扁舟", "俊杰俄从此地游", "义士若能知此理", "反射逃难可无忧"}
    // 使用匿名函数输出每句诗中的第一个字
    getText(poem, func(v string) {
        u := []rune(v)
        fmt.Printf("%c", u[0])
    })
}
运行结果如下:

芦俊义反

在上述代码中,使用自定义函数 getText() 封装切片的遍历。在主函数中调用 getText() 时传递一个回调函数作为参数,该回调函数使用的就是匿名函数,它的作用是输出每句诗中的第一个字,在遍历时实现找出藏头诗中暗藏文字的功能。

相关文章