文章目錄
1. 概述
程序中的流程控制語句,用於設置程序的執行次序,體現程序執行流程的實現部分,建立程序的基本邏輯結構.
2. 條件判斷分支- if
Go語言中使用 if 關鍵字進行條件判斷 ,條件判斷的語句終值爲 true 或者 false
2.1 單分支
語法格式 :
if 表達式 {
分支1
}
package main
import "fmt"
func main(){
var condition bool = true
age := 19
if condition {
fmt.Println("condition is true ")
}
if age >= 18{
fmt.Println("成年人的世界,沒有容易二字")
}
// 也可以使用 ! 進行反向判斷
if !(1>2){
fmt.Println("1不大於2")
}
}
$ go run main.go
condition is true
成年人的世界,沒有容易二字
1不大於2
if 後面的條件判斷語句可以是一個表達式
package main
import "fmt"
func compareNum(x, y int) bool {
if x < y {
return false
}
return true
}
func main() {
// if 後面的可以是一個表達式
if month := 8; month <= 9 {
fmt.Printf("現在是%d月份\n", month)
}
x := 90
y := 10
// 也是一個表達式
if compareNum(x, y) {
fmt.Printf("x = %d 大於 y = %d\n", x, y)
}
}
$ go run main.go
現在是8月份
x = 90 大於 y = 10
2.2 雙分支
語法格式 :
if 表達式{
分支1
}else{
分支2
}
package main
import "fmt"
func main(){
var age int
fmt.Println("請輸入年齡[0~120] : ")
fmt.Scanln(&age)
if age >18{
fmt.Println("成年人")
}else{
fmt.Println("未成年人")
}
}
$ go run main.go
請輸入年齡[0~120] :
99
成年人
注意 if後面跟的表達式的形式的最終結果是bool類型,不論表達式以怎麼樣的形式出現
package main
import "fmt"
func main() {
var n1 float64 = 89.99
var n2 float64 = 10.01
b := true
if n1 >= 88.00 || n2 < 11.00 && (n1+n2) > 99.99 && b {
fmt.Println("條件都滿足")
} else {
fmt.Println("條件都不滿足")
}
}
$ go run main.go
條件都滿足
2.3 多分支
多分支控制
if 表達式1 {
分支1
}else if 表達式2{
分支2
}else if 表達式3{
分支3
}…
package main
import "fmt"
func main() {
var score int
fmt.Println("請輸入學生分數[0~100] : ")
fmt.Scanln(&score)
if score > 100 || score < 0 {
fmt.Println("分數範圍不正確")
} else if score >= 90 {
fmt.Println("成績優秀")
} else if score >= 80 {
fmt.Println("成績良好")
} else if score >= 70{
fmt.Println("成績普通")
} else if score >= 60 {
fmt.Println("成績及格")
}else{
fmt.Println("成績不及格")
}
}
$ go run main.go
請輸入學生分數[0~100] :
76
成績普通
3. 條件選擇分支- switch
switch是根據不同的執行條件,執行不同的邏輯分支代碼,每個case分支都是唯一的,自上而下逐一匹配
- switch 和case 的表達式可以是 常量,變量,也可以是表達式
- Go語言中的switch語句中的case分支,結尾處不需要break(和其他編程語言有區別)
- case後面表達式的數據類型,必須和switch的表達式一致
- case後面的表達式可以是多個,使用逗號隔開
- switch中default 也可以不需要
- switch後面也可以沒有表式,此種情況下整個switch結構和if…else…邏輯作用等同
示例1
package main
import "fmt"
func main(){
var n int
fmt.Println("please input number[1~7]: ")
fmt.Scanln(&n)
switch n {
case 1:
fmt.Println("Monday")
case 2:
fmt.Println("Tuesday")
case 3:
fmt.Println("Wednesday")
case 4:
fmt.Println("Thursday")
case 5:
fmt.Println("Friday")
case 6:
fmt.Println("Saturday")
case 7 :
fmt.Println("Sunday")
default :
fmt.Println("Unknown")
}
}
$go run main.go
please input number[1~7]:
7
Sunday
示例2
package main
import "fmt"
func main(){
var n int
fmt.Println("please input number[1~10]: ")
fmt.Scanln(&n)
switch n {
case 2,4,6,8,10:
fmt.Println("even number")
case 1,3,5,7,9:
fmt.Println("Odd number")
default :
fmt.Println("Unknown")
}
}
示例3
package main
import "fmt"
func compareNum(x, y int) int {
if x > y {
return x
} else if y > x {
return y
}
return 0
}
func main() {
var x int
var y int
fmt.Println("input two number x = ? and y = ?:")
fmt.Scanln(&x, &y)
switch {
case compareNum(x, y) == x:
fmt.Println("x is big")
case compareNum(x, y) == y:
fmt.Println("y is big")
case compareNum(x, y) == 0:
fmt.Println("x == y")
}
}
$ go run main.go
input two number x = ? and y = ?:
90 90
x == y
fallthrough穿透 : 在case語句後面增加fallthrough會繼續執行下一個case的內容
package main
import "fmt"
func main() {
var passWorld string = "root123456"
switch {
case passWorld == "root123456":
fmt.Println("passworld is ok")
fallthrough
case passWorld != "root123456":
fmt.Println("passworld is error")
fallthrough
default:
fmt.Println("passworld is null")
}
}
$ go run main.go
passworld is ok
passworld is error
passworld is null
4. 循環控制-for
Go語言循環只支for關鍵字,不支持while和do…while結構
語法格式
for 循環變量初始化 ; 循環控制條件 ; 循環變量變化語句{
循環體語句
}
- 一般的for 循環中循環體不斷的執行,直到循環控制條件不成立,for循環結束
- for循環可以通過break ,goto,return,panic等語句退出循環
- 無限循環也是通過for關鍵字實現,通常會配合一些結束條件
4.1 標準的for循環
package main
import "fmt"
func main(){
// 求1到100整數的累加和
// 寫法1 標準的for循環寫法
var sum1 int = 0
for i:=1;i<=100 ;i++ {
sum1 += i
}
fmt.Println("寫法1:從1累加到100的和是 : ",sum1)
// 寫法2
var sum2 int = 0
i := 1
for i<=100{
sum2 +=i
i++
}
fmt.Println("寫法2:從1累加到100的和是 : ",sum2)
// 寫法3
var sum3 int = 0
j := 1
for ;;j++{
if j>100{
break
}
sum3 += j
}
fmt.Println("寫法3:從1累加到100的和是 : ",sum3)
}
$ go run main.go
寫法1:從1累加到100的和是 : 5050
寫法2:從1累加到100的和是 : 5050
寫法3:從1累加到100的和是 : 5050
4.2 for 無限循環
實現類似do…while
package main
import "fmt"
func main(){
i:= 0
for{
if i>10{
break
}
fmt.Println("i = ",i)
i++
}
}
$ go run main.go
i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10
4.3 for 循環嵌套
package main
import "fmt"
func main() {
// 打印一個九九乘法表
for i := 1; i <= 9; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d X %d = %d\t", j, i, i*j)
}
fmt.Println()
}
}
$ go run main.go
1 X 1 = 1
1 X 2 = 2 2 X 2 = 4
1 X 3 = 3 2 X 3 = 6 3 X 3 = 9
1 X 4 = 4 2 X 4 = 8 3 X 4 = 12 4 X 4 = 16
1 X 5 = 5 2 X 5 = 10 3 X 5 = 15 4 X 5 = 20 5 X 5 = 25
1 X 6 = 6 2 X 6 = 12 3 X 6 = 18 4 X 6 = 24 5 X 6 = 30 6 X 6 = 36
1 X 7 = 7 2 X 7 = 14 3 X 7 = 21 4 X 7 = 28 5 X 7 = 35 6 X 7 = 42 7 X 7 = 49
1 X 8 = 8 2 X 8 = 16 3 X 8 = 24 4 X 8 = 32 5 X 8 = 40 6 X 8 = 48 7 X 8 = 56 8 X 8 = 64
1 X 9 = 9 2 X 9 = 18 3 X 9 = 27 4 X 9 = 36 5 X 9 = 45 6 X 9 = 54 7 X 9 = 63 8 X 9 = 72 9 X 9 = 81
4.4 for-range 遍歷
for循環配合for…range語句結構可以遍歷字符串,數組,切片,map和通道(channel)
package main
import "fmt"
func main() {
// for-range遍歷
// 遍歷字符串
var str string = "golang中國"
fmt.Println("遍歷字符串 :")
for k, v := range str {
fmt.Printf("%d==>%c\t", k, v)
}
//遍歷數組
var arr = [...]string{"one", "two", "three"}
fmt.Printf("\n遍歷數組 :\n")
for k, v := range arr {
fmt.Printf("%d==>%s\t", k, v)
}
// 遍歷切片
var sli []string = []string{"A", "B", "C"}
fmt.Printf("\n遍歷切片 :\n")
for k, v := range sli {
fmt.Printf("%d==>%s\t", k, v)
}
fmt.Printf("\n遍歷map :\n")
// 遍歷map
var personalInfo = map[string]string{
"name": "tom",
"addr": "beijing",
"cardNo": "471823781238812389X",
}
for k, v := range personalInfo {
fmt.Printf("%s:%s\n", k, v)
}
}
$ go run main.go
遍歷字符串 :
0==>g 1==>o 2==>l 3==>a 4==>n 5==>g 6==>中 9==>國
遍歷數組 :
0==>one 1==>two 2==>three
遍歷切片 :
0==>A 1==>B 2==>C
遍歷map :
addr:beijing
cardNo:471823781238812389X
name:tom
遍歷channel
package main
import "fmt"
func main() {
c := make(chan string)
go func() {
c<-"AA"
c<-"BB"
c<-"CC"
c<-"DD"
close(c)
}()
for v := range c{
fmt.Println(v)
}
}
$ go run main.go
AA
BB
CC
DD
5. 循環控制
5.1 break
break 語句可以結束for 的代碼塊,break 可以在後面添加標籤,表示退出某個標籤的代碼塊
package main
import (
"fmt"
"math/rand"
"time"
)
func main(){
// 初始化一個變量當做計數器
count := 0
for{
rand.Seed(time.Now().UnixNano())
n := rand.Intn(10000)+1
fmt.Println("n = ",n)
count++
if n == 88{
break
}
}
fmt.Printf("生成88一共執行了%d次",count)
}
$ go run main.go
n = 88
生成88一共執行了468640次
break 通過標籤指明要終止的語句塊
- break 默認跳出最近的for循環
- break 指定跳出標籤,跳出標籤對應的for循環
package main
import "fmt"
func main() {
LL_1:
for i := 0; i < 5; i++ {
fmt.Printf("i=%d\n",i)
LL_2:
for j := 0; j <= 10; j++ {
fmt.Printf("\tj=%d\n",j)
if i == 2{
break LL_1
}
for k:=0;k<=10 ;k++ {
fmt.Printf("\t\tk=%d\n",k)
if k == 3{
break LL_2
}
}
}
}
fmt.Println("golang")
}
$ go run main.go
i=0
j=0
k=0
k=1
k=2
k=3
i=1
j=0
k=0
k=1
k=2
k=3
i=2
j=0
golang
5.2 continue
continue語句表示跳出本次循環,進入下一個循環中
package main
import "fmt"
func main(){
for i:=0;i<=10;i++{
for j:=0;j<10;j++{
if (i*j)%2==0{
continue
}
fmt.Printf("%d * %d = %d\n",j,i,j*i)
}
}
}
continue 後面也可添加標籤, 指明要跳過那一層循環
package main
import "fmt"
func main(){
LOOP:
for i:=0;i<=5;i++{
for j:=0;j<5;j++{
switch j {
case 2:
fmt.Println(i,j)
continue LOOP
}
}
}
}
$ go run main.go
0 2
1 2
2 2
3 2
4 2
5 2
6. 跳轉
Go語言中goto語句可以直接跳轉到指定的行
package main
import "fmt"
func main() {
for i:= 0;i<20 ;i++{
fmt.Println("Loop :",i)
if i == 5{
goto Here
}
}
fmt.Println("A")
fmt.Println("B")
Here:
fmt.Println("it is over")
fmt.Println("main process is over")
}
$ go run main.go
Loop : 0
Loop : 1
Loop : 2
Loop : 3
Loop : 4
Loop : 5
it is over
main process is over
goto的一個應用場景 : 錯誤統一處理
package main
import (
"errors"
"fmt"
)
func checkError1()error{
return errors.New("checkError_1 error")
}
func checkError2()error{
return errors.New("checkError_2 error")
}
func main(){
err := checkError1()
if err != nil{
goto operateError
}
err = checkError2()
if err != nil{
goto operateError
}
fmt.Println("program is ok")
operateError:
fmt.Println(err)
}
$ go run main.go
checkError_1 error