Go核心开发学习笔记(十) —— 循环控制

循环控制

  1. Golang语言中不存在while和do…while,只存在for,for完全可以替代while的循环格式,通过加入break或者continue跳出循环。

  2. for基本格式:

    for \<循环变量初始化>;<循环条件>;<循环变量迭代> {
     			\<循环体>
     		}
    

    示例1:

    for i := 1 ; i < = 10 ; i++ {
    	\<循环体>
    }
    

    示例2:

    var i int = 1
    for i ;  i < = 10 ; i++ {
    	\<循环体>
    }
    

    示例3:

    for {                  //实际上等同于 for ; ; {...},也就是 for <空值>;<空值>;<空值> {...}
    	var i int = 1
    	if i <= 10 {
    		\<执行语句>
    	} else {
    		break
    	}
    	i++
    }                      //等同于实现了while功能。
    
  3. 注意for循环中如果定义变量,那么只在作用域仅仅在本循环内,一个代码文件中包含多个 for i … i互不影响
    示例1:

    for i := 1 ; i <= 10 ; i++ {     
    	\<循环体>
    }
    fmt.Println("i的值为: ",i)        //这个编译会报错,因为i只处于循环体作用域,下面全局变量的"i"根本不存在
    

    示例2:

    i := 1
    for ; i <= 10 ; i++ {     
    	\<循环体>
    }
    fmt.Println("i的值为: ",i)        //这个编译就没有问题了,因为变量在循环体外,作用域是main函数体。
    
  4. 字符串遍历,提取字符串中的每个字符,默认遍历是使用byte逐一遍历,所以对于utf8汉字的三个bytes编码,拆分后会出现乱码
    类似Python,字符串中的字符可以使用string[i]下标的方式来提取,下面通过三个示例演示要点:
    示例1:

    var str string = "Oh!shit!"           //标准英文字符串
    for i := 0 ; i <= len(str) ; i++ {
    	fmt.Printf("%c",str[i]) 
    }                                     //因为循环是按照byte遍历,所以标准ascii编码的都没有问题,但是如果存在汉字,那么就出现乱码
    

    示例2:

    var dest string = "oh!shit!踩到狗屎了"     //包含中文了
    str := []rune(dest)
    for i := 0; i <= len(str) ; i++ {
    	fmt.Printf("%v\n",str[i])
    }  
    //使用切片后,按照字符遍历了。使用切片方式结果正确,但是报错 
    //panic: runtime error: index out of range待解决
    

    示例3: 使用range,此种方法最为推荐

    var str1 string = "oh!shit!又踩到狗屎了"
     //一般会有一个index和value配合使用,在此直接用下划线_忽略,index为索引
     for _ , value := range str1 {             
     	fmt.Printf("%c\n",value)
     }
    
  5. 案例:打印1~100之间所有是9的倍数的整数,和这些整数的和

    package main
    
    import "fmt"
    
    func main() {
    	var i int = 1
    	var sum int
    	for ; i <= 100 ; i++ {
    		if i % 9 == 0 {
    			fmt.Printf("%v\t",i)
    			sum += i
    		}
    	}
    	fmt.Println()
    	fmt.Printf("这些数的总和为:%v",sum)
    }
    
  6. 案例:打印出下面的格式 0+6=6 1+5=6 … 6+0=6 都换行

    package main
    
    import "fmt"
    
    func main() {
    	for i := 0 ; i <= 6 ; i++ {
    		fmt.Printf("%d + %d = 6\n",i,6-i)
    	}
    }
    
  7. 循环嵌套:建议最多包含两层嵌套,否则逻辑关系太复杂,如果内循环n次,外循环m次,这样执行次数就是 n*m次
    案例: Ti中4个dota2战队:og,eg,lgd,wings,每个战队五名队员,输入每个人的能力值(0~99),求每个战队的平均能力值以及四个战队的平均能力值

    package main
    
    import "fmt"
    
    func main() {
    	/*
    	需求:Ti中4个dota2战队:og,eg,lgd,wings,每个战队五名队员,输入每个人的能力值(0~99)。
    	求每个战队的平均能力值以及四个战队的平均能力值。
    
    	需求分析:
    		目前尚不知道Golang列表循环咋整,因为按照教程没学到!做映射吧也不知道咋做,干脆战队1234吧
    		只要求出每个战队平均能力值,相加之后除以便是四个战队总平均能力值
    		两层嵌套已经很费劲了,稍微不注意就会出错,代码如下
    	 */
    	var totalSum float64
    	for j := 1 ; j <= 4 ; j++ {
    		var memAbil float64
    		var teamSum float64
    		var teamAvg float64
    
    		for i := 1; i <= 5; i++ {
    			fmt.Printf("请输入战队%d的第%d名成员的能力值: \n",j,i)
    			fmt.Scanf("%v",&memAbil)
    			teamSum += memAbil
    			teamAvg = teamSum / 5
    		}
    		fmt.Printf("战队%d的平均能力值为:%f\n",j,teamAvg)
    		totalSum += teamAvg
    	}
    	fmt.Printf("四支战队总的平均能力值为:%f",totalSum / 4)
    }
    
  8. 案例:打印99乘法表(经典问题)

    package main
    
    import "fmt"
    
    func main() {
    	/*
    	需求:99乘法表
    	1 * 1 = 1
    	1 * 2 = 2	2 * 2 = 4
    	1 * 3 = 3   2 * 3 = 6	3 * 3 = 9
    
    	需求分析:
    	两层循环,分别用变量i,j表示
    	打印肯定是 fmt.Printf("%d * %d = %d") 具体分析三个%d应该对应哪些变量
    	变量定义在main()中,不要直接定义在for循环作用域中
    	 */
    	var j int
    	var i int
    	var num int
    
    	fmt.Println("请输入乘数的最大值:")
    	fmt.Scanf("%d",&num)
    	fmt.Println("乘法表结果如下: ")
    	for j = 1 ; j <= num ; j++ {
    		for i = 1; i <= j; i++ {
    			fmt.Printf("%d * %d = %d\t", i,j,i*j )
    		}
    		fmt.Println()
    	}
    }
    
发布了50 篇原创文章 · 获赞 18 · 访问量 4019

猜你喜欢

转载自blog.csdn.net/weixin_41047549/article/details/89638566