6、流程控制

一、if

  • if使用:逻辑表达式成立,就会执行{}里的内容;逻辑表达式不需要加()
if 5 > 9 {
    
    
    fmt.Println("5>9")
}
  • if句子中允许包含1个(仅1个)分号:在分号前初始化一些局部变量(即只在if块内可见)
func main() {
    
    
	m := make(map[int]string, 10)
	m[0] = "abc"
	if value, ok := m[1]; ok {
    
    
		fmt.Printf("[%s]", value)
	} else {
    
    
		fmt.Printf("[%s]", m[0])
	}

}

二、switch

  • switch:switch和case后面可以跟常量、变量或函数表达式,只要它们表示的数据类型相同就行
func main() {
    
    
	color := "black"
	switch color {
    
    
	case "green": //相当于  if color== "green"
		fmt.Println("go")
	case "red": //相当于else if color== "red"
		fmt.Println("stop")
	default: //相当于else
		fmt.Printf("invalid traffic signal: %s\n", strings.ToUpper(color)) //invalid traffic signal: BLACK
	}
}
  • switch+表达式
    • switch后带表达式时,switch-case只能模拟相等的情况;
    • 如果switch后不带表达式,case后就可以跟任意的条件表达式
func add(a int) int {
    
    
	return a + 10
}

func main() {
    
    
	switch {
    
    
	case add(5) > 10:
		fmt.Println("right")
	default:
		fmt.Println("wrong")
	}
}
  • switch Type
func switch_type() {
    
    
	var num interface{
    
    } = 6.5
	//等价形式
	switch num.(type) {
    
    
	case int:
		value := num.(int)
		fmt.Printf("number is int %d\n", value)
	case float64:
		value := num.(float64)
		fmt.Printf("number is float64 %f\n", value)
	case byte:
		value := num.(byte)
		fmt.Printf("number is byte %d\n", value)
	default:
		fmt.Println("neither")
	}
}
  • switch效率:从上往下,只要找到成立的case,就不再执行后面的case了;所以为提高性能,把大概率会满足的情况往前放
  • fallthrough
    • case里如果带了fallthrough,则执行完本case还会去判断下一个case是否满足
    • 在switch type语句的 case 子句中不能使用fallthrough
func no_fall(age int) {
    
    
	switch {
    
    
	case age > 50:
		fmt.Println("退休")
	case age > 25:
		fmt.Println("生子")
	case age > 22:
		fmt.Println("结婚")
	}
}

func fall(age int) {
    
    
	switch {
    
    
	case age > 50:
		fmt.Println("退休")
		fallthrough
	case age > 25:
		fmt.Println("生子")
		fallthrough
	case age > 22:
		fmt.Println("结婚")
	}
}

func main() {
    
    
	no_fall(60) //退休

	fmt.Println("-----------------------")

	fall(60)
	//退休
	//生子
	//结婚
}

三、for

  • for遍历
func main() {
    
    
	arr := []int{
    
    1, 2, 3, 4, 5}
	for i := 0; i < len(arr); i++ {
    
     //正序遍历切片
		fmt.Printf("%d: %d\n", i, arr[i])
	}
}
  • for range遍历for range拿到的是数据的拷贝
    • 遍历数组或切片:for i, ele := range arr
    • 遍历string:for i, ele := range "我会唱ABC" //ele是rune类型
    • 遍历map,go不保证遍历的顺序:for key, value := range m
    • 遍历channel,遍历前一定要先close:for ele := range ch
func main() {
    
    
	str := "我会唱ABC"                         //1个汉字占3个byte
	fmt.Printf("len(str) = %d\n", len(str)) // len(str) = 12

	for i, ele := range str {
    
    
		fmt.Printf("%d %c\n", i, ele)
	}

	// 0 我
	// 3 会
	// 6 唱
	// 9 A
	// 10 B
	// 11 C

	fmt.Println("--------------------")

	brr := []byte(str)
	fmt.Printf("len(brr) = %d\n", len(brr)) //len(brr) = 12

	for i, ele := range brr {
    
    
		fmt.Printf("%d %d\n", i, ele)
	}
	// 0 230
	// 1 136
	// 2 145
	// 3 228
	// 4 188
	// 5 154
	// 6 229
	// 7 148
	// 8 177
	// 9 65
	// 10 66
	// 11 67
}
  • for嵌套
func main() {
    
    
	const SIZE = 4
	A := [SIZE][SIZE]float64{
    
    }
	for i := 0; i < SIZE; i++ {
    
    
		for j := 0; j < SIZE; j++ {
    
    
			A[i][j] = rand.Float64() //[0,1)中的随机数
		}
	}
	fmt.Println(A)
}

四、break与continue

  • break与continue区别
    • break与continue用于控制for循环的代码流程,并且只针对最靠近自己的外层for循环
    • break和continue都是针对for循环的,不针对if或switch
    • break:退出for循环,且本轮break下面的代码不再执行
    • continue:本轮continue下面的代码不再执行,进入for循环的下一轮
func break_for() {
    
    
	arr := []int{
    
    1, 2, 3, 4, 5}
	for i, ele := range arr {
    
    
		fmt.Println("before break", i, ele)
		if i > 2 {
    
    
			break
		}
		fmt.Println(i, ele)
	}

}

func continue_for() {
    
    
	arr := []int{
    
    1, 2, 3, 4, 5}
	for i, ele := range arr {
    
    
		fmt.Println("before continue", i, ele)
		if i > 2 {
    
    
			continue
		}
		fmt.Println(i, ele)
	}
}

func main() {
    
    
	break_for()
	// before break 0 1
	// 0 1
	// before break 1 2
	// 1 2
	// before break 2 3
	// 2 3
	// before break 3 4

	fmt.Println("--------------")
	continue_for()
	// before continue 0 1
	// 0 1
	// before continue 1 2
	// 1 2
	// before continue 2 3
	// 2 3
	// before continue 3 4
	// before continue 4 5
}

五、goto与Label

  • goto、Label
func main() {
    
    
	var i int = 4
MY_LABEL:
	i += 3
	fmt.Println(i)
	goto MY_LABEL //返回定义MY_LABEL的那一行,把代码再执行一遍(会进入一个无限循环)
}

猜你喜欢

转载自blog.csdn.net/qq23001186/article/details/129085917
今日推荐