0
点赞
收藏
分享

微信扫一扫

Go 函数 学习笔记


​​函数function:​​

  • Go 函数 不支持 嵌套、重载和默认参数
    但支持以下特性:

无需声明原型、不定长度变参、多返回值、命名返回值参数
匿名函数、闭包

  • 定义函数使用关键字 func,且左大括号不能另起一行
  • 函数也可以作为一种类型使用

​​defer​​

  • defer的执行方式类似其它语言中的析构函数,在函数体执行结束后按照调用顺序的相反顺序逐个执行,即使函数发生严重错误也会执行。
  • 支持匿名函数的调用
  • 常用于资源清理、文件关闭、解锁以及记录时间等操作
  • 通过与匿名函数配合可在return之后修改函数计算结果
  • 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer
    时即已经获得了拷贝,否则则是引用某个变量的地址

package main

import (
"fmt"
)

func main() {
defer fmt.Println(1111)
defer fmt.Println(2222)
// fmt.Println("-------------------")
for i := 0; i < 3; i++ {
defer fmt.Println(i)
}
// fmt.Println("-------------------")
// 如果函数体内某个变量作为defer时匿名函数的参数,则在定义defer时即已经获得了拷贝,否则则是引用某个变量的地址
for i := 4; i < 7; i++ {
defer f(i)
}
// fmt.Println("-------------------")
for i := 7; i < 10; i++ { //闭包
defer func() {
fmt.Println(i)
}()
}
// fmt.Println("-------------------")

}

func f(a int) {
fmt.Println(a)
}

输出结果:

Go 函数 学习笔记_defer

​​panic/recover​​

Go 没有异常机制,但有 panic/recover 模式来处理错误
Panic 可以在任何地方引发,但recover只有在defer调用的函数中有效

package main

import (
"fmt"
)

func main() {
A()
B()
C()
}

func A() {
fmt.Println("func A")
}

func B() {
defer func() {
if err := recover(); err != nil {
fmt.Println("recover in b")
}
}()
panic("panic in b")
}

func C() {
fmt.Println("func C")
}

输出结果:

Go 函数 学习笔记_panic_02


个人微信公众号:

Go 函数 学习笔记_闭包_03

作者:jiankunking

举报

相关推荐

0 条评论