Golang 流程控制

  • 条件语句
    • if
    • switch
    • select
  • 循环语句
    • for    循环
      • break、continue、goto    退出循环
    • for range    键值循环

条件语句 if

(1)基本写法

if 布尔表达式1 {
    分支1
} else if 布尔表达式2 {
    分支2
} else{
    分支3
}

// 代码示例
func demo() {
	score := 82
	if score > 90 {
		fmt.Println("A")
	} else if score > 75 {
		fmt.Println("B")
	} else {
		fmt.Println("C")
	}
}

(2)特殊写法

if 语句,还有一种特殊的写法:可以在 if 表达式之前,添加一个执行语句,再根据变量值进行判断

func demo() {
	if score := 100; score > 90 {
		fmt.Println("A")
	} else if score > 75 {
		fmt.Println("B")
	} else {
		fmt.Println("C")
	}
}

(3)注意事项

  • 布尔表达式,不需使用括号 {} 将条件包含起来
  • 大括号 {},必须存在,即使只有一行语句
  • 左括号,必须在if或else的同一行
  • if 之后,条件语句之前,可以添加变量初始化语句,使用 ; 进行分隔,其作用域仅限条件语句

条件语句 switch

Golang 中,使用 switch 可以用于判断多个值的情况

// 基本写法
switch var1 {
    case val1:
        ...        // 不同的case之间不使用break分隔,默认只会执行一个case
    case val2:
        ...
    default:
        ...
}

// 代码示例
func f() {
	grade := "A"
	switch grade {
	case "A":
		fmt.Println("优秀")
	case "B":
		fmt.Println("良好")
	default:
		fmt.Println("一般")
	}
}

  • case 支持多条件匹配:即,可以同时匹配多个条件,中间用逗号分隔,有其中一个匹配成功即可
func f() {
	day := 3
	switch day {
	case 1, 2, 3, 4, 5:
		fmt.Println("工作日")
	case 6, 7:
		fmt.Println("休息日")
	}
}
  • case 可以是条件表达式:即,分支可以使用表达式
func f() {
	score := 90
	switch {
	case score >= 90:
		fmt.Println("享受假期")
	case score < 90 && score >= 80:
		fmt.Println("好好学习吧!")
	default:
		fmt.Println("玩命学习!")
	}
}
  • 可以使用 fallthrough,执行满足条件的下一个 case
func f3() {
	a := 100
	switch a {
	case 100:
		fmt.Println("100")
		fallthrough
	case 200:
		fmt.Println("200")
	case 300:
		fmt.Println("300")
	default:
		fmt.Println("other")
	}
}

for 循环语句

Golang 中,所有循环类型,都可以使用 for 关键字来完成

// 基本语法 - for 表达式不用加括号
for 初始语句;条件表达式;结束语句{
    循环体语句
}

// 代码示例
func demo() {
	// 循环打印 1-10
	for i := 1; i <= 10; i++ {
		fmt.Println(i)
	}
}

不同的使用方式:

// 初始条件,可以写到外面,但分号必须保留
func f() {
	i := 1
	for ; i <= 10; i++ {
		fmt.Printf("i: %v\n", i)
	}
}


// 初始条件和结束条件都可以省略,类似于 where
func f() {
	i := 1 // 初始条件
	for i <= 10 {
		fmt.Printf("i: %v\n", i)
		i++ // 结束条件
	}
}

// 无限循环
func f() {
	for {
		fmt.Println("我一直在执行~")
	}
}

「 退出循环 break、continue、goto 」 for 循环,可以通过 break、goto、return、panic 语句,强制退出循环

(1)break  跳出循环

  • break 语句,可以结束 for、switch 和 select 的代码块
func demo() {
	for i := 0; i < 10; i++ {
		if i == 3 {
			break
		}
		fmt.Println(i)  // 0 1 2
	}
}
  • 还可以,在语句后面添加标签,表示退出某个标签对应的代码块
// 标签要求必须定义在对应的for、switch和 select的代码块上
func demo() {
BREAKDEMO:
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				break BREAKDEMO
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	fmt.Println("...")
}

(2)continue  跳过当前循环

  • continue 语句,可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用
func demo() {
	for i := 0; i < 10; i++ {
		if i == 3 {
			continue
		}
		fmt.Println(i) // 0 1 2 4 5 6 7 8 9
	}
}
  • 在 continue 语句后,添加标签时,表示开始标签对应的循环
func demo() {
forloop1:
	for i := 0; i < 5; i++ {
		// forloop2:
		for j := 0; j < 5; j++ {
			if i == 2 && j == 2 {
				continue forloop1
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
}

(3)goto  跳转到指定标签

goto 语句,通过标签,进行代码间的无条件跳转,在快速跳出循环、避免重复退出上,能够简化一些代码的实现过程

func gotoDemo1() {
	var breakFlag bool
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				breakFlag = true
				break
			}
			fmt.Printf("%v-%v\n", i, j)
		}
		// 外层for循环判断
		if breakFlag {
			break
		}
	}
}

// 使用 goto 语句能够简化代码
func gotoDemo2() {
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				goto breakTag
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	return
	// 标签
breakTag:
	fmt.Println("结束for循环")
}

键值( key - value )循环 for range

Golang 中,可以使用 for range 遍历 数组、slice、map 及 字符串 和 channel,其中:

  • 数组、slice、字符串,返回索引和值
  • map,返回键和值
  • channel,只返回通道内的值
// 基本语法  -  快捷键:forr
for key, value := range coll {
    ...
}

// 代码示例 - 循环数组
func demo() {
	arr := [...]int{
		1, 2, 3, 4, 5,
	}
	for i, v := range arr {
		fmt.Printf("i: %d, v: %v\n", i, v)
	}
}

// 代码示例 - 循环字符串
func demo() {
	str := "helloWorld"
	for i, v := range str {
		fmt.Printf("i: %d, v: %c\n", i, v)
	}
}

// 代码示例 - 循环切片
func demo() {
	arr := []int{
		1, 2, 3, 4, 5,
	}
	for _, v := range arr {
		fmt.Printf("v: %v\n", v)
	}
}

// 代码示例 - 循环 map
func demo() {
	m := make(map[string]string)
	m["name"] = "小明"
	m["age"] = "20"

	for k, v := range m {
		fmt.Printf("k: %v,v:%v\n", k, v)
	}
}