Go语言入门:循环结构

91 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情


Go语言的循环结构没那么复杂,只有一个for循环结构,没有while和do-while。

1. for循环基本结构

基本语法如下:

for 初始化变量 ; 判断条件 ; 修正变量 {
    代码段(循环体)
}
  • 初始化变量:对一个变量进行初始化,以记录循环次数
  • 判断条件:看条件是否成立,如果成立进入花括号{},执行循环体一次;不成立则循环结束
  • 修正变量:改变变量的值,再去执行判断条件,看是否条件是否还成立,如果符合,再去执行循环体一次

具体执行流程如下图:① -> ② -> ④ -> ③ -> ② -> ④ -> ③...直到②不成立为止

image.png

练习:用for循环打印0-9

func main() {
   for i := 0; i < 10; i++ {
      fmt.Println(i)
   }
}

注意这里的i只在for结构里有用,出了结构就不能再使用了

练习:求1-100数字之和

func main() {
   sum := 0
   for i := 1; i <= 100; i++ {
      sum += i
   }
   fmt.Println(sum)
}

练习:求1-100的偶数和

func main() {
   sum := 0
   for i := 1; i <= 100; i++ {
      if i%2 == 0 {
         sum += i
      }
   }
   fmt.Println(sum)
}

2. break语句

有时候使用循环结构时,即使条件满足,我也想强制跳出结束整个循环,这时候就要用到break关键字。

break作用:结束当前循环,后面的代码也不会再执行

比如本来我要打印0-9这些数,现在我突然改想法,打印到3(不算3这个数)就不打印了,除了可以更改条件判断语句外,我们就可以引用break关键字。具体如下:

func main() {
   for i := 0; i < 10; i++ {
      if i == 3 {
         break
      }
      fmt.Println(i)
   }
}

break常用在无法判断for要循环多少次的情况。可以看下面的案例进行理解。

案例:用户名和密码

题目:要求用户输入用户名和密码,只要不是用户名为admin,密码为888888,就一直让用户重新输入

解析:我们无法判断用户到底要输入多少次才能输入正确,这时候我们就要用到死循环和break。

死循环:就是一直循环,无法终止。只能用break跳出。就是for后面直接跟{},{}里加循环体代码

func main() {
   var userName string
   var userPwd string
   for {
      fmt.Println("请输入用户名:")
      fmt.Scan(&userName)
      fmt.Println("请输入密码:")
      fmt.Scan(&userPwd)
      //对用户名和密码进行判断
      if userName == "admin" && userPwd == "888888" {
         fmt.Println("输入正确")
         break //正确就跳出结束循环
      } else {
         fmt.Println("输入的用户名或密码错误,请重新输入")
      }
   }
}

现在我改一下题目:如果用户输入错误次数超过三次(即第三次还输入错误),就提示“输入错误信息次数太多”,并结束整个程序。

func main() {
   var userName string
   var userPwd string
   var count int //记录用户输错的次数
   for {
      fmt.Println("请输入用户名:")
      fmt.Scan(&userName)
      fmt.Println("请输入密码:")
      fmt.Scan(&userPwd)
      //对用户名和密码进行判断
      if userName == "admin" && userPwd == "888888" {
         fmt.Println("输入正确")
         break
      } else {
         count++
         if count >= 3 {
            fmt.Println("输入错误信息次数太多")
            break
         }
         fmt.Println("输入的用户名或密码错误,请重新输入")
      }
   }
}

3. continue语句

continue作用:结束本轮循环,然后进行循环条件的判断,如果成立则进行下一轮循环,否则退出循环。

注意continue是结束的本轮循环,会继续进行条件判断;而break是跳出结束整个循环,不会再进行条件判断。

比如我要用continue实现:输入1-5这几个数字,而3除外。

func main() {
   for i := 1; i <= 5; i++ {
      if i == 3 {
         continue
      }
      fmt.Println(i)
   }
}

4. 循环嵌套

循环体里有循环结构就是循环嵌套

比如一个人一天吃三顿饭,每次吃饭时要说“我要吃饭”,并重复说三天。

func main() {
   for i := 0; i < 3; i++ {
      for j := 0; j < 3; j++ {
         fmt.Println("我要吃饭")
      }
   }
}

再比如我要输出一个矩形,一行有5个*,共5行。

func main() {
   for i := 0; i < 5; i++ {
      for j := 0; j < 5; j++ {
         fmt.Print("*")
      }
      fmt.Println()
   }
}

5. 循环综合练习

练习:计算营业额

题目:2006年营业额80000元,每年增长25%,请问按此增长速度,到哪一年营业额将达到20万元?

func main() {
   year := 2006
   var money float64
   for money = 80000; money <= 200000; money *= 1.25 {
      year++
   }
   fmt.Println(year)
}

练习:水仙花数

题目:找出100-999间的水仙花数

水仙花数:是指一个三位数,他的每位数字的立方和等于其本身

func main() {
   for num := 100; num <= 999; num++ {
      a := num / 100
       b := num % 100 / 10  //或 b:= num / 10 % 10 
      c := num % 10
      if a*a*a+b*b*b+c*c*c == num {
         fmt.Println(num)
      }
   }
}

练习:乘法口诀表

func main() {
   for i := 1; i < 10; i++ {
      for j := 1; j < 10; j++ {
         fmt.Print(i, "*", j, "=", i*j, " ")
      }
      fmt.Println()
   }
}

这是矩形的,下面打印个三角形的

func main() {
   for i := 1; i < 10; i++ {
      for j := 1; j <= i; j++ {
         fmt.Print(i, "*", j, "=", i*j, " ")
      }
      fmt.Println()
   }
}