Go语言流程控制

一、for

  • Go语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,关键字 for 的基本使用方法与C语言和C++ 中非常接近

  • for 后面的条件表达式不需要用圆括号()括起来,Go语言还进一步考虑到无限循环的场景,让开发者不用写无聊的 for(;;){}do{} while(1);,而直接简化为如下的写法

    sum := 0
    for {
        sum++
        if sum > 100 {
            break
        }
    }
    
  • Go语言的 for 循环同样支持 continue 和 break 来控制循环**,但是它提供了一个更高级的 break,可以选择中断哪一个循环**

    for i := 0; i < 2; i++ {
    	tab:
    		for j := 0; j < 2; j++ {
    			if j >= 1 {
    				break tab //终端里层循环
    			}
    			fmt.Printf("i:%d,j:%d\n", i, j)
    			//i:0,j:0
    			//i:1,j:0
    		}
    	}
    
  • 将 if 判断整合到 for 中

    for i <= 10 {
        i++
    }
    

二、for range(键值循环)

  • for range 结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道(channel),一般形式为

    for key, val := range coll {
        ...
    }
    
  • val 始终为集合中对应索引的值拷贝

  • 一个字符串是 Unicode 编码的字符(或称之为 rune )集合,因此也可以用它来迭代字符串,返回的是ASCII值

    str := "ab"
    for k, v := range str {
    	fmt.Printf("k:%d,v:%c\n", k, v) //k:0,v:a k:1,v:b
    }
    
  • 通过 for range 遍历的返回值有一定的规律

    • 数组、切片、字符串返回索引和值
    • map 返回键和值
    • 通道(channel)只返回通道内的值

三、switch case语句

  • 概念

    • Go语言的 switch 要比C语言的更加通用,表达式不需要为常量,甚至不需要为整数,case 按照从上到下的顺序进行求值,直到找到匹配的项,如果 switch 没有表达式,则对 true 进行匹配,因此,可以将 if else-if else 改写成一个 switch

    • Go语言改进了 switch 的语法设计,case 与 case 之间是独立的代码块,不需要通过 break 语句跳出当前 case 代码块以避免执行到下一行

      	var a = "hello"
      	switch a {
      	case "hello":
      		fmt.Println(1) //1
      	case "world":
      		fmt.Println(2)
      	default:
      		fmt.Println(0)
      	}
      
  • 使用方法

    • 一分支多值,当出现多个 case 要放在一起的时候,可以写成下面这样

      var a = "hello"
      switch a {
      case "world", "hello":
      	fmt.Println(1) //1
      default:
      	fmt.Println(0)
      }
      
    • 分支表达式,case 后不仅仅只是常量,还可以和 if 一样添加表达式(这种情况的 switch 后面不再需要跟判断变量)

      	var r int = 11
      	switch {
      	case r > 10 && r < 20:
      		fmt.Println(r) //11
      	}
      
    • 跨越 case 的 fallthrough——兼容C语言的 case 设计(使用此关键字后,case和C中一样可以进行穿透)

      var s = "hello"
      switch {
      case s == "hello":
          fmt.Println("hello")
          fallthrough
      case s != "world":
          fmt.Println("world")
      }
      //hello
      //world
      

四、使用goto退出多层循环

  • 传统退出多层循环的方式

    	flag := false
    	for i := 0; i < 10; i++ {
    		for j := 0; j < 10; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				flag = true
    				break
    			}
    		}
    		if flag {
    			break
    		}
    	}
    
  • goto退出多层循环

    	for i := 0; i < 10; i++ {
    		for j := 0; j < 10; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				goto breakHere
    			}
    		}
    	}
    breakHere: //goto标签
    	fmt.Println("done")
    
  • 不建议在程序之中出现goto语句,跳出多层循环可以采用标签的方法

    flag:
    	for i := 0; i < 10; i++ {
    		for j := 0; j < 10; j++ {
    			fmt.Println(i, j)
    			if j == 1 {
    				break flag //结束外层循环,也就是停止循环
    			}
    		}
    	}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值