ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**定义:** ~~~ func function_name( [parameter list] ) [return_types] { 函数体 } ~~~ **特性:** 1. 无需声明原型 2. 不定长度变参 3. 多返回值 4. 命名返回值参数 5. 匿名函数 6. 闭包 ## 一、不定参数 ~~~ package main import ( "fmt" ) func main() { test(1, 2, 3, 4, 5) } func test(nums ...int) { fmt.Println(nums) } ~~~ 结果: ~~~ [1 2 3 4 5] ~~~ ## 二、指针参数 ~~~ package main import ( "fmt" ) func main() { num := 3 test(&num) fmt.Println(num) // 4 } func test(num *int) { *num = 4 } ~~~ ## 三、闭包 ~~~ package main import ( "fmt" ) func main() { bar := foo(2) result := bar(3) fmt.Println(result) // 5 } func foo(a int) func(int) int { return func(b int) int { return a + b } } ~~~ ## 四、defer修饰符 * defer的执行方式类似其它语言中的析构函数,在函数执行体结束后按照调用顺序的相反顺序逐个执行 * 即使函数发生严重错误也会执行 * 支持匿名函数的调用 * 通常用于资源清理、文件关闭、解锁以及记录时间等操作 * 通过与匿名函数配合可在return之后修改函数计算结果 * 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则则是引用某个变量的地址 * GO没有异常机制,但有panic/recover模式来处理错误 * Panic可以在任何地方引发,但recover只有在defer调用的函数中有效 ~~~ package main import ( "fmt" ) func main() { fmt.Println("A") defer fmt.Println("B") defer fmt.Println("C") } ~~~ 结果: ~~~ A C B ~~~ ## 五、链式调用 ``` package main import "fmt" type Integer int func (a Integer) Less(b Integer) bool { return a < b } func main() { var a Integer = 1 if a.Less(2) { fmt.Println("less then 2") } } ```