函数定义
func test( [parameter list] ) [return] {
函数体
}
函数定义解析:func
定义函数的关键字test
函数名称parameter list
传参return
返回值
案例:
func Add(a, b int) int {
return a + b
}
返回多个值:
func main() {
a, b := Add("hello", "world")
fmt.Println(a,b)
}
func Add(a, b string) (string, string) {
return a, b
}
不定参数
func main() {
Add(1, 2)
Add(1, 2, 3)
}
func Add(args ...int) { // 可以接受不固定的参数
}
匿名函数和闭包
func main() {
func () {
fmt.Println("hello")
}() //直接调用
}
defer延迟调用
func main() {
// defer延迟调用,main函数结束前调用
defer fmt.Println("b")
fmt.Println("a")
}
打印结果:
a
b
多个defer
多个defer会先进后出 哪怕某个函数发生错误,这些调用仍然会被执行。
func main() {
// defer延迟调用,main函数结束前调用
defer fmt.Println("b")
defer fmt.Println("a")
}
打印结果:
a
b
c
defer 执行顺序
- defer延迟调用会在后面语句执行完毕执行
- 在return更新完返回值后再去执行defer
- 多个defer会先进后出 第一个defer会最后执行
- 判断执行没有err之后,再defer释放资源
func main() {
file, err := os.Open("./go.mod")
// 判断是否操作成功
if err != nil {
fmt.Printf("open file failed err: %v", err)
return
}
// 延迟调用 操作成功在defer
defer file.Close()
}
函数作参数
func main() {
f1(100, sum)
}
func f1(x int, y func(int, int)) {
y(x, 2)
}
func sum(x, y int) {
fmt.Printf("%d", x + y)
}
闭包
func main() {
sum := f2(f1, 100, 200)
sum()
}
func f1(x, y int) {
fmt.Println(x + y)
}
func f2(f func(int, int), a, b int) func() {
tmp := func() {
f(a, b)
}
return tmp
}