转载请注明出处:https://blog.csdn.net/sublio/article/details/106478408
全系列目录:https://blog.csdn.net/sublio/article/details/106480267
基本控制流程
目录
代码块
-
有花括号构成
-
重新声明外层代码块声明过的标识符,此时外层空间外层代码块的那个同名标识符被屏蔽了
func main() {
a := 1
if a == 1 {
var a string
fmt.Println(a)
{
var a []int
fmt.Println(len(a))
}
}
}
switch
-
同一个case后面可以接多个表达式,关系为或
-
fallthrought向下一个case转移流程控制权
for与range
-
对字符串的range为rune(之前的用法可能有一些问题,应该转为[]byte再range)
-
对map进行range顺序是不一定的
-
对chan进行range,只有一个返回值,
-
可以对nil的silce和map进行range操作,只是没东西,
-
对nil的通道进行迭代,会导致当前流程永远阻塞在for语句上
defer
-
延迟调用指定函数
-
顺序:所有defer;返回;将运行时恐慌扩散至函数调用处
-
同一个函数里面多个defer对应函数的调用顺序:与defer执行顺序相反(先进后出)
-
defer后面的函数要使用外部变量,应该使用参数传递
//示例1:输出55555
func main() {
for i := 0; i < 5; i++ {
defer func() {
fmt.Println(i)
}()
}
}
//示例2:输出43210
func main() {
for i := 0; i < 5; i++ {
defer func(a int) {
fmt.Print(a)
}(i)
}
}
panic和recover
-
手动停止当前流程并引发一个运行时恐慌(运行时恐慌不一定是panic引发的,有可能是go的运行时系统引发的,比如index out of range)
-
panic()的参数可以是任务类型,一般是string或者error
-
用p := recover()来拦截运行时恐慌,有恐慌的时候p为非nil,用panic触发时p等于interface(panic的参数)
参考文档
《Go并发编程实战(第2版)》——郝林