Go语言中定义函数使用func关键字,具体格式以下:闭包
func 函数名(参数)(返回值){ 函数体 }
其中:函数
func intSum(x int, y int) int { return x + y } // 函数的参数和返回值都是可选的 func sayHello() { fmt.Println("Hello World!") }
函数的参数中若是相邻变量的类型相同,则能够省略类型,例如:code
func intSum(x, y int) int { return x + y }
可变参数是指函数的参数数量不固定。Go语言中的可变参数经过在参数名后加...
来标识。回调函数
注意:可变参数一般要做为函数的最后一个参数。string
Go语言中函数支持多返回值,函数若是有多个返回值时必须用()
将全部返回值包裹起来。class
func calc(x, y int) (int, int) { sum := x + y sub := x - y return sum, sub }
函数定义时能够给返回值命名,并在函数体中直接使用这些变量,最后经过return
关键字返回。test
func calc(x, y int) (sum, sub int) { sum = x + y sub = x - y return }
Go语言中的defer
语句会将其后面跟随的语句进行延迟处理。在defer
归属的函数即将返回时,将延迟处理的语句按defer
定义的逆序进行执行,也就是说,先被defer
的语句最后被执行,最后被defer
的语句,最早被执行。匿名函数
func main() { fmt.Println("start") defer fmt.Println(1) defer fmt.Println(2) defer fmt.Println(3) fmt.Println("end") } // 结果:start end 3 2 1
匿名函数就是没有函数名的函数,匿名函数多用于实现回调函数和闭包。变量
匿名函数的定义格式以下:引用
func(参数)(返回值){ 函数体 } // 当即执行函数 func main() { func(x, y int) { fmt.Println(x + y) }(10, 20)//匿名函数定义完加()直接执行 }
闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来讲,闭包=函数+引用环境
。一些闭包示例:
func adder() func(int) int { var x int return func(y int) int { x += y return x } } func main() { var f = adder() fmt.Println(f(10)) //10 fmt.Println(f(20)) //30 fmt.Println(f(30)) //60 f1 := adder() fmt.Println(f1(40)) //40 fmt.Println(f1(50)) //90 } // 示例2 func adder2(x int) func(int) int { return func(y int) int { x += y return x } } func main() { var f = adder2(10) fmt.Println(f(10)) //20 fmt.Println(f(20)) //40 fmt.Println(f(30)) //70 f1 := adder2(20) fmt.Println(f1(40)) //60 fmt.Println(f1(50)) //110 } // 示例3 func makeSuffixFunc(suffix string) func(string) string { return func(name string) string { if !strings.HasSuffix(name, suffix) { return name + suffix } return name } } func main() { jpgFunc := makeSuffixFunc(".jpg") txtFunc := makeSuffixFunc(".txt") fmt.Println(jpgFunc("test")) //test.jpg fmt.Println(txtFunc("test")) //test.txt } // 示例4 func calc(base int) (func(int) int, func(int) int) { add := func(i int) int { base += i return base } sub := func(i int) int { base -= i return base } return add, sub } func main() { f1, f2 := calc(10) fmt.Println(f1(1), f2(2)) //11 9 fmt.Println(f1(3), f2(4)) //12 8 fmt.Println(f1(5), f2(6)) //13 7 }