代码示例
package main
import (
"fmt"
"strings"
)
func main() {
// 匿名函数,不能够独立存在(编译器会返回错误:non-declaration statement outside function body)
// 可以被赋值于某个变量,即保存函数的地址到变量中
// 然后通过变量名对函数进行调用
test := func(x, y int) {fmt.Println(x+y)}
test(1,3)
// 直接调用匿名函数
// 表示参数列表的第一对括号必须紧挨着关键字 func,因为匿名函数没有名称
// 花括号 {} 涵盖着函数体
// 最后的一对括号表示对该匿名函数的调用
func(x,y int) {fmt.Println(x+y)}(1,4)
// 将函数作为返回值
// 闭包函数保存并积累其中的变量的值,不管外部函数退出与否,它都能够继续操作外部函数中的局部变量。
var f = Adder()
fmt.Print(f(10), " - ")
fmt.Print(f(20), " - ")
fmt.Println(f(30))
// 一个返回值为另一个函数的函数可以被称之为工厂函数
addBmp := MakeAddSuffix(".bmp")
addJpeg := MakeAddSuffix(".jpeg")
fmt.Println(addBmp("file")) // returns: file.bmp
fmt.Println(addJpeg("file")) // returns: file.jpeg
}
// 求和
func Adder() func(int) int {
var x int
return func(delta int) int {
x += delta
return x
}
}
// 添加后缀
func MakeAddSuffix(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
运行结果:
4
5
10 - 30 - 60
file.bmp
file.jpeg