条件语句if
基本形式
if a > b {
...
} else {
...
}
与其他主要编程语⾔的差异
- condition 表达式结果必须为布尔值;
- ⽀持变量赋值
if var declaration; condition {
...
}
选择语句 switch
基本形式
switch var {
case condition1:
code block1
case condition2:
code block2
default:
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 assertion
Process(v)
return
}
// varI is not of type T
package main
import "fmt"
func main() {
var test interface{}
test = true
switch 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.”)
//break
case "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 := 0
for n < 5 {
n++
fmt.Println(n)
}
循环体内的变量每次都是重新生成的
package main
import "fmt"
func main() {
for i := 1; i <= 3; i++ {
v := 1
fmt.Println(&v)
}
}
// result
0xc420014060
0xc420014068
0xc420014080
跳转语句 goto break continue
- 这三个语句都可以配合标签使用
- break和continue配合标签可以跳出多层循环
- goto是调整位置,与其他两个语句配合标签的结果并不相同
goto 跳转到指定语句
goto One
fmt.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")
}