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")
}