非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第7章 函数
- 7.6 延迟执行语句
- 7.7 小结
第7章 函数
7.6 延迟执行语句
Go语言中存在一种延迟执行的语句,由defer关键字标识,格式如下:
defer 任意语句
defer后的语句不会被马上执行,在defer所属的函数即将返回时,函数体中的所有defer语句将会按出现的顺序被逆序执行,即函数体中的最后一个defer语句最先被执行。
[ 动手写 7.6.1]
package main
import "fmt"
func main() {
fmt.Println("start now")
defer fmt.Println("这是第一句 defer语句")
defer fmt.Println("这是第二句 defer语句")
defer fmt.Println("这是第三句 defer语句")
fmt.Println("end")
}
运行结果
由于defer语句是在当前函数即将返回时被调用,所以defer常常被用来释放资源。
[ 动手写 7.6.2 ]
package main
import (
"fmt"
"net"
)
func tcpSend() {
conn, err := net.Dial("tcp", "www.baidu.com:80")
if err == nil {
defer conn.Close()
fmt.Println("remote address: ", conn.RemoteAddr())
}
fmt.Println("error: ", err)
}
func main() {
tcpSend()
}
运行结果
由于www.baidu.com对应的远端IP的80端口处于开启状态,在本机与该地址建立连接后和函数退出前,需要对打开的文件描述符conn进行关闭。
7.7 小结
- Go语言中,函数的声明以关键字func为标识。
- Go语言支持可变参数的特性,即函数声明时可以没有固定数量的参数。
- 匿名函数即在需要函数时定义函数,匿名函数能以变量方式传递,它常常被用于实现闭包。
- 闭包就是包含了自由变量的匿名函数,其中的自由变量即使已经脱离了原有的自由变量环境也不会被删除,在闭包的作用域内可继续使用这个自由变量。
- defer语句是在当前函数即将返回时被调用,所以defer常常被用来释放资源。