Go语言基础语法 | 青训营笔记

62 阅读2分钟

image.png
这是我参与「第五届青训营 」伴学笔记创作活动的第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关键字的特性,常常将其用于关闭资源,如关闭数据库连接、关闭文件流等资源。 此时我们思考一个问题,一个函数中同时出现returndefer,函数在执行完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在函数生命周期结束后再执行
}

执行结果如下图

image.png 由结果可以知道,函数在执行完return语句后,还会继续执行defer后面的语句,这是因为defer后的语句是在函数生命周期结束之后才会执行!