这是我参与「第五届青训营 」伴学笔记创作活动的第1天
变量
使用var关键字声明
go中声明一个变量,可采用var关键字进行声明,其中又分为指定变量类型和不指定变量类型两种写法
指定变量类型
//声明一个变量。初始化一个值,指定类型
var name int = 100
fmt.Println(name)
fmt.Printf("type of a = %T\n", name)
不指定变量类型
//声明一个变量。初始化一个值,不指定类型
var name1 = "100"
fmt.Println(name1)
fmt.Printf("type of a = %T\n", name1)
声明变量并指定类型但不初始化值
// 没有初始化就为零值
var b int
声明多个变量
//声明多个变量
var aa, bb = 100, 22
fmt.Println(aa, bb)
多行变量声明
// 多行变量声明
var (
cc = 111
dd = true
)
fmt.Println(cc, dd)
省去var关键字
使用 := 即可声明一个变量
//省去var关键字
arr := "11"
fmt.Printf("%T\n", arr)
defer关键字
Go语言的 defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。
由于defer关键字的特性,常常将其用于关闭资源,如关闭数据库连接、关闭文件流等资源。
此时我们思考一个问题,一个函数中同时出现return和defer,函数在执行完return语句后,是否还会执行defer后面的语句呢
package main
import "fmt"
func deferFnc() int {
fmt.Println("deferFnc")
return 0
}
func returnFuc() int {
fmt.Println("returnFuc")
return 0
}
func returnAndDefer() int {
defer deferFnc()
return returnFuc()
}
func main() {
returnAndDefer()
//return语句先于defer语句执行
//defer在函数生命周期结束后再执行
}
执行结果如下图
由结果可以知道,函数在执行完return语句后,还会
继续执行defer后面的语句,这是因为defer后的语句是在函数生命周期结束之后才会执行!