Go 入门 03流程控制if / for / switchGo 的流程控制语句非常精简没有while、没有do-while、没有三目运算符但靠for和switch就能优雅地搞定绝大部分场景。一、if 语句1.1 基本形式ifscore60{fmt.Println(及格)}elseifscore90{fmt.Println(优秀)}else{fmt.Println(不及格)}注意条件表达式不需要括号大括号{必须与if同一行Go 语言规范强制。1.2 if 中的初始化语句Go 的if支持在条件前定义局部变量作用域仅限 if/else 块内这是 Go 中非常 idiomatic 的写法iferr:doSomething();err!nil{log.Println(err)return}// err 变量在这里已不可访问二、for 循环Go只有 for 一种循环关键字但通过不同形式可以胜任所有循环场景。2.1 三段式C 风格fori:0;i10;i{fmt.Println(i)}2.2 while 风格i:0fori10{fmt.Println(i)i}2.3 死循环for{// 通常配合 break / return 使用ifshouldStop(){break}}2.4 range 遍历最常用// 遍历切片nums:[]int{1,2,3}fori,v:rangenums{fmt.Println(i,v)}// 遍历 mapm:map[string]int{a:1,b:2}fork,v:rangem{fmt.Println(k,v)}// 遍历字符串按 runefori,r:rangeHello, 世界{fmt.Printf(%d: %c\n,i,r)}// 遍历 channelforv:rangech{fmt.Println(v)}只想要 index 或 value 时fori:rangenums{...}// 只要索引for_,v:rangenums{...}// 只要值2.5 break / continue / goto// break 跳出最近一层循环fori:0;i5;i{ifi3{break}}// 配合 label 跳出多层循环OUTER:fori:0;i5;i{forj:0;j5;j{ifj2{breakOUTER}}}// continue 跳过本次循环三、switch 语句3.1 基本形式Go 的switch默认每个case自动 break不需要写 breakswitchday{caseMon,Tue,Wed,Thu,Fri:fmt.Println(工作日)caseSat,Sun:fmt.Println(周末)default:fmt.Println(非法输入)}3.2 表达式 switch替代 if-else 链switch{casescore60:fmt.Println(不及格)casescore80:fmt.Println(良好)default:fmt.Println(优秀)}3.3 fallthrough如果想保留 C 风格的穿透行为使用fallthroughswitchn:1;n{case1:fmt.Println(一)fallthroughcase2:fmt.Println(二)}// 输出一 二3.4 类型 switchtype switch用于判断接口的真实类型funcdescribe(iinterface{}){switchv:i.(type){caseint:fmt.Printf(int: %d\n,v)casestring:fmt.Printf(string: %s\n,v)casenil:fmt.Println(nil)default:fmt.Printf(unknown: %T\n,v)}}四、defer 延迟执行虽然defer不属于流程控制但它对控制流影响极大必须掌握。funcreadFile()error{f,err:os.Open(a.txt)iferr!nil{returnerr}deferf.Close()// 函数返回前必定执行// ... 业务代码returnnil}特性后进先出LIFO参数在defer语句执行时立即求值配合recover可以捕获 panic。fori:0;i3;i{deferfmt.Println(i)// 输出 2 1 0}五、实战FizzBuzzfori:1;i100;i{switch{casei%150:fmt.Println(FizzBuzz)casei%30:fmt.Println(Fizz)casei%50:fmt.Println(Buzz)default:fmt.Println(i)}}六、小结Go 只有for一种循环if/switch都支持初始化语句这是 Go 的标志写法switch默认 break需要穿透要fallthroughdefer是资源清理的绝佳搭档。下一篇我们将进入 Go 的核心概念之一函数与多返回值。
Go 入门 03:流程控制(if / for / switch)
Go 入门 03流程控制if / for / switchGo 的流程控制语句非常精简没有while、没有do-while、没有三目运算符但靠for和switch就能优雅地搞定绝大部分场景。一、if 语句1.1 基本形式ifscore60{fmt.Println(及格)}elseifscore90{fmt.Println(优秀)}else{fmt.Println(不及格)}注意条件表达式不需要括号大括号{必须与if同一行Go 语言规范强制。1.2 if 中的初始化语句Go 的if支持在条件前定义局部变量作用域仅限 if/else 块内这是 Go 中非常 idiomatic 的写法iferr:doSomething();err!nil{log.Println(err)return}// err 变量在这里已不可访问二、for 循环Go只有 for 一种循环关键字但通过不同形式可以胜任所有循环场景。2.1 三段式C 风格fori:0;i10;i{fmt.Println(i)}2.2 while 风格i:0fori10{fmt.Println(i)i}2.3 死循环for{// 通常配合 break / return 使用ifshouldStop(){break}}2.4 range 遍历最常用// 遍历切片nums:[]int{1,2,3}fori,v:rangenums{fmt.Println(i,v)}// 遍历 mapm:map[string]int{a:1,b:2}fork,v:rangem{fmt.Println(k,v)}// 遍历字符串按 runefori,r:rangeHello, 世界{fmt.Printf(%d: %c\n,i,r)}// 遍历 channelforv:rangech{fmt.Println(v)}只想要 index 或 value 时fori:rangenums{...}// 只要索引for_,v:rangenums{...}// 只要值2.5 break / continue / goto// break 跳出最近一层循环fori:0;i5;i{ifi3{break}}// 配合 label 跳出多层循环OUTER:fori:0;i5;i{forj:0;j5;j{ifj2{breakOUTER}}}// continue 跳过本次循环三、switch 语句3.1 基本形式Go 的switch默认每个case自动 break不需要写 breakswitchday{caseMon,Tue,Wed,Thu,Fri:fmt.Println(工作日)caseSat,Sun:fmt.Println(周末)default:fmt.Println(非法输入)}3.2 表达式 switch替代 if-else 链switch{casescore60:fmt.Println(不及格)casescore80:fmt.Println(良好)default:fmt.Println(优秀)}3.3 fallthrough如果想保留 C 风格的穿透行为使用fallthroughswitchn:1;n{case1:fmt.Println(一)fallthroughcase2:fmt.Println(二)}// 输出一 二3.4 类型 switchtype switch用于判断接口的真实类型funcdescribe(iinterface{}){switchv:i.(type){caseint:fmt.Printf(int: %d\n,v)casestring:fmt.Printf(string: %s\n,v)casenil:fmt.Println(nil)default:fmt.Printf(unknown: %T\n,v)}}四、defer 延迟执行虽然defer不属于流程控制但它对控制流影响极大必须掌握。funcreadFile()error{f,err:os.Open(a.txt)iferr!nil{returnerr}deferf.Close()// 函数返回前必定执行// ... 业务代码returnnil}特性后进先出LIFO参数在defer语句执行时立即求值配合recover可以捕获 panic。fori:0;i3;i{deferfmt.Println(i)// 输出 2 1 0}五、实战FizzBuzzfori:1;i100;i{switch{casei%150:fmt.Println(FizzBuzz)casei%30:fmt.Println(Fizz)casei%50:fmt.Println(Buzz)default:fmt.Println(i)}}六、小结Go 只有for一种循环if/switch都支持初始化语句这是 Go 的标志写法switch默认 break需要穿透要fallthroughdefer是资源清理的绝佳搭档。下一篇我们将进入 Go 的核心概念之一函数与多返回值。