条件语句if
基本形式
if a > b {...} else {...}
与其他主要编程语⾔的差异
- condition 表达式结果必须为布尔值;
- ⽀持变量赋值
if var declaration; condition {...}
选择语句 switch
基本形式
switch var {case condition1:code block1case condition2:code block2default:code block3}

与其他主要编程语⾔的差异
- 条件表达式不限制为常量或者整数;
- 单个 case 中,可以出现多个结果选项, 使⽤逗号分隔;
- 与 C 语⾔等规则相反, Go 语⾔不需要⽤break来明确退出⼀个 case;如果希望继续执行下一个case,需要使用fallthrough;
- 可以不设定 switch 之后的条件表达式,在此种情况下,整个 switch 结构与多个 if…else… 的逻辑作⽤等同;
- switch 语句还可用于type-switch来判断某个interface中实际存储的变量类型。
TODO 判断变量类型
一个接口类型的变量 varI 中可以包含任何类型的值,必须有一种方式来检测它的 动态 类型,即运行时在变量中存储的值的实际类型,在执行过程中动态类型可能会有所不同。
varI 必须是一个接口变量,否则编译器会报错:invalid type assertion: varI.(T) (non-interface type (type of varI) on left)
如果转换合法,v 是 varI 转换到类型 T 的值,ok 会是 true;否则 v 是类型 T 的零值,ok 是 false,也没有运行时错误发生。
if v, ok := varI.(T); ok { // checked type assertionProcess(v)return}// varI is not of type T
package mainimport "fmt"func main() {var test interface{}test = trueswitch test.(type) {case int:fmt.Print("整型")case string:fmt.Print("字符串")default:fmt.Print("都不是")}}
switch 中含赋值语句和条件
switch os := runtime.GOOS; os {case "darwin":fmt.Println("OS X.”)//breakcase "linux":fmt.Println("Linux.")default:// freebsd, openbsd,// plan9, windows...fmt.Printf("%s.", os)}
实现多个 if
switch {case 0 <= Num && Num <= 3:fmt.Printf("0-3")case 4 <= Num && Num <= 6:fmt.Printf("4-6")case 7 <= Num && Num <= 9:fmt.Printf("7-9")}
循环语句 for
方式1 无限循环
for true {}// 简写for {}
方式2 条件循环
for init;condition;increase {}
方式3 遍历切片
a := []string{"a","b","c"}for key,val := range a {fmt.Print(key)fmt.Print(val)fmt.Print("\n")}
方式4 while 条件循环
n := 0for n < 5 {n++fmt.Println(n)}
循环体内的变量每次都是重新生成的
package mainimport "fmt"func main() {for i := 1; i <= 3; i++ {v := 1fmt.Println(&v)}}// result0xc4200140600xc4200140680xc420014080
跳转语句 goto break continue

- 这三个语句都可以配合标签使用
- break和continue配合标签可以跳出多层循环
- goto是调整位置,与其他两个语句配合标签的结果并不相同
goto 跳转到指定语句
goto Onefmt.Print("middle code")One:fmt.Print("last code")
break 跳出本层循环
func main(){for {for i := 1; i <= 10; i++ {if i < 3 {fmt.Println(i)} else {break}}}fmt.Println("break")}
