原文链接:http://oldchen.iwulai.com/index.php/2019/01/17/go%E5%9F%BA%E7%A1%80%E7%BC%96%E7%A8%8B%EF%BC%9A%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6/
Go语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。
- 顺序结构:程序按顺序执行,不发生跳转。
- 选择结构:依据是否满足条件,有选择的执行相应功能。
- 循环结构:依据条件是否满足,循环多次执行某段代码。
1.选择结构
* 条件表达式没有括号
* 支持一个初始化表达式(可以是并行方式)
* 左大括号和条件语句或else在同一行
* 支持单行模式
* 初始化语句中的变量我block级别,同时隐藏外部同名变量(即就近原则)
1.1if语句
package main
import "fmt"
func main() {
var a int =3
if a == 3 {
fmt.Println("a=3")//a=3
}
if b := 3; b == 3 {
fmt.Println("b=3")//b=3
}
}
1.2if else语句
package main
import "fmt"
func main() {
if a := 3; a == 4 {
fmt.Println("a==4")
} else { //左大括号必须和条件语句或else在同一行
fmt.Println("a!=4")//a!=4
}
}
1.3if … else if … else语句
package main
import "fmt"
func main() {
if a := 3; a > 3 {
fmt.Println("a>3")
} else if a < 3 {
fmt.Println("a<3")
} else if a == 3 {
fmt.Println("a==3")//a==3
} else {
fmt.Println("error")
}
}
1.4switch语句
* 可以使用任何类型或表达式作为条件语句
* 不需要写break,一旦条件符合自动终止
* 如希望继续执行下一个case,需使用fallthrough语句
* 支持一个初始化表达式(可以是并行方式),右侧需跟分号
* 左大括号必须和条件语句在同一行
Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码:
package main
import "fmt"
func main() {
var score int = 90
switch score{
case 90:
fmt.Println("优秀")//优秀
case 80:
fmt.Println("良好")
case 50, 60, 70:
fmt.Println("一般")
default:
fmt.Println("差")
}
}
使用任何类型或表达式作为条件语句:
//1
switch s1 := 90; s1 { //初始化语句;条件
case 90:
fmt.Println("优秀")
case 80:
fmt.Println("良好")
default:
fmt.Println("一般")
}
//2
var s2 int = 90
switch { //这里没有写条件
case s2 >= 90: //这里写判断语句
fmt.Println("优秀")
case s2 >= 80:
fmt.Println("良好")
default:
fmt.Println("一般")
}
//3
switch s3 := 90; { //只有初始化语句,没有条件
case s3 >= 90: //这里写判断语句
fmt.Println("优秀")
case s3 >= 80:
fmt.Println("良好")
default:
fmt.Println("一般")
}
2.循环语句
* Go只有for一个循环语句关键字,但支持3种形式
* 初始化和步进表达式可以是多个值
* 条件语句每次循环都会被重新检查,不建议在条件语句中使用函数,尽量提前计算好并以变量或常量代替
* 左大括号必须与条件语句在同一行
2.1for
var i, sum int
for i = 1; i <= 100; i++ {
sum += i
}
fmt.Println("sum = ", sum)
2.2range
s := "abc"
for i := range s { //支持 string/array/slice/map。
fmt.Printf("%c\n", s[i])
}
for _, c := range s { // 忽略 index
fmt.Printf("%c\n", c)
}
跳转语句
* 三个语法都可以配合标签使用
* 标签名区分大小写,定义了若不使用则会造成编译错误
* break和continue配合标签可用于多层循环的跳出
* goto是跳转执行位置,与其他2个配合标签使用结果不同
break和continue
在循环里面有两个关键操作break和continue,break操作是跳出当前循环,continue是跳过本次循环。
for i := 0; i < 5; i++ {
if 2 == i {
//break //break操作是跳出当前循环
continue //continue是跳过本次循环
}
fmt.Println(i)
}
当嵌套过深的时候,break和continue还可以跟着标号,用来跳到多重循环中的外层循环:
func main() {
LABEL:
for i := 0; i < 5; i++ {
for {
fmt.Println(i)
break LABEL //跳出所有循环
//continue LABEL //只是跳过for {}循环,外层循环继续
}
}
}
注意:break可⽤于for、switch、select,⽽continue仅能⽤于for循环。
goto
用goto跳转到必须在当前函数内定义的标签:
func main() {
LABEL:
for i := 0; i < 5; i++ {
for {
fmt.Println(i)
//break LABEL //跳出所有循环
//continue LABEL //只是跳过for {}循环,外层循环继续
goto LABEL //跳转到标签LABEL,从这里开始,执行代码
}
}
}