八、3.函数类型、匿名函数和闭包

1.函数类型与匿名函数

函数也可以赋值给变量,存储在数组、切片、映射中,也可作为参数传递给函数或作为函数
返回值进行返回

//函数的参数 数量 对应类型以及返回值类型 称之为函数的签名
package main

import "fmt"
func add(a, b int) int {
    return a + b
}
//传递list函数进来  赋值给callback  执行callback(args...) 需要把args解包 并且传递给list
func print(callback func(...string), args ...string) {
    callback(args...)
}
//函数可以传递给函数 也可以作为返回值返回  前提是 签名相同
func list(args ...string) {
    for k, v := range args {
        fmt.Println(k, ":", v)
    }
}

func main() {
    //定义函数类型的变量
    //只要函数的签名相同可以赋值给一个变量
    //签名指的是形参类型 数量以及返回值类型
    var f func(a, b int) int = add
    fmt.Printf("%T\n", f)
    fmt.Println(f(1, 2))
    print(list, "aaa", "bbb")
    //匿名函数
    //在定义变量的时候用函数来初始化变量值  其实就等于在函数外定义了一个seayHello函数
    seayHello := func(nums string) {
        fmt.Println("hello", nums)
    }
    seayHello("aaa")
    //定义匿名函数并且调用
    func(num string) {
        fmt.Println("hello", num)
    }("shuaibo")
    values := func(args ...string) {
        for _, v := range args {
            fmt.Println(v)
        }
    }
    print(values, "a", "b")
    //传递的过程中直接传递一个匿名函数进去
    print(func(args ...string) {
        for _, v := range args {
            fmt.Print(v, "\t")
        }
        fmt.Println()
    }, "a", "b")
}

2.闭包

匿名函数有叫闭包, 是指在函数内定义的匿名函数引用外部函数的变量,只要匿名函数继 
续使用则外部函数赋值的变量不被自动销毁

package main

import (
    "fmt"
)
func main() {
    //闭包:返回一个函数的时候用到了外面作用域的一个变量
    //函数调用后变量是要销毁的,但是 如下所示add10在存在的时候base 是不能够销毁的 ,因为内部返回的函数会用到外部作用域的一个变量base
    addbase := func(base int) func(int) int {
        return func(n int) int {
            return base + n
        }
    }
    add10 := addbase(10)
    fmt.Println(addbase(5)(10))
    fmt.Println(add10(5))
    a := inputString("sss")
}
发布了92 篇原创文章 · 获赞 12 · 访问量 5687

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/104786662