一、Go语言基础之流程控制

不用像js写括号之类;写了保存时也会编译成统一默认格式

if else(分支结构)

Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与else匹配的{也必须与else写在同一行,else也必须与上一个ifelse if右边的大括号在同一行。

if条件判断基本写法

  1. if 表达式1 {
  2. 分支1
  3. } else if 表达式2 {
  4. 分支2
  5. } else{
  6. 分支3
  7. }
  8. func ifDemo1() {
  9. score := 65
  10. if score >= 90 {
  11. fmt.Println("A")
  12. } else if score > 75 {
  13. fmt.Println("B")
  14. } else {
  15. fmt.Println("C")
  16. }
  17. }

if条件判断特殊写法

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

  1. func ifDemo2() {
  2. if score := 65; score >= 90 {
  3. fmt.Println("A")
  4. } else if score > 75 {
  5. fmt.Println("B")
  6. } else {
  7. fmt.Println("C")
  8. }
  9. }

思考:ifDemo1和ifDemo2的区别?

for(循环结构)

  1. func luoji() {
  2. // 第一种:此时循环体内i是局部
  3. for i := 0; i < 10; i++ {
  4. if i < 9 {
  5. fmt.Printf("%d ", i)
  6. } else {
  7. fmt.Println(i)
  8. }
  9. }
  10. // 第二种:i是全局定义的(for循环的初始语句可以被忽略,但是初始语句后的分号必须要写)
  11. var i = 0
  12. for ; i < 10; i++ {
  13. if i < 9 {
  14. fmt.Printf("%d ", i)
  15. } else {
  16. fmt.Println(i)
  17. }
  18. }
  19. // 第三种:j是全局定义的;j++在循环体内部自定义计数时机(for循环的初始语句和结束语句都可以省略)
  20. // 类似于其他编程语言中的while,在while后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。
  21. var j = 0
  22. for j < 10 {
  23. if j < 9 {
  24. fmt.Printf("%d ", j)
  25. } else {
  26. fmt.Println(j)
  27. }
  28. j++
  29. }
  30. // 第四种 无限循环
  31. // for循环可以通过break、goto、return、panic语句强制退出循环。
  32. for {
  33. fmt.Println("无限循环")
  34. }
  35. // 第五种:for range(键值循环)
  36. /*
  37. Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历
  38. 的返回值有以下规律:
  39. · 数组、切片、字符串返回索引和值。
  40. · map返回键和值。
  41. · 通道(channel)只返回通道内的值。
  42. */
  43. str := "你好世界!"
  44. fmt.Println(len(str))
  45. for i, v := range str {
  46. // for _, v := range str {// 使用哑元变量占位
  47. fmt.Printf("%d %c\n", i, v)
  48. }
  49. }

switch case

Go语言规定每个switch只能有一个default分支。

switch后面有变量

判断n的值与case分支是否相等或包含,不支持表达式

  1. func switchDemo1() {
  2. n := 3
  3. switch n {
  4. // switch n := 7; n {// 1. 方案2:在 switch 表达式之前添加一个执行语句
  5. // 2. 一个分支可以有多个值,多个case值中间使用英文逗号分隔。
  6. case 1,2,3:
  7. fmt.Println("小于4")
  8. /* 3. fallthrough语法可以执行满足条件的case的下一个case(不管下一个case条件是否满足都会执行),
  9. 是为了兼容C语言中的case设计的。*/
  10. fallthrough
  11. case 100:
  12. fmt.Println("满分")
  13. default:
  14. fmt.Println("无效的输入!")
  15. }
  16. }

switch后面无变量

支持表达式

  1. func switchDemo4() {
  2. age := 30
  3. switch {// switch之后没有变量,则不会比较是否相等。才可以写表达式
  4. case age < 25:
  5. fmt.Println("好好学习吧")
  6. case age > 25 && age < 35:
  7. fmt.Println("好好工作吧")
  8. case age > 60:
  9. fmt.Println("好好享受吧")
  10. default:
  11. fmt.Println("活着真好")
  12. }
  13. }

break(跳出循环)-当前循环

break语句可以结束forswitchselect的代码块。不再执行后面的循环。
break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的forswitchselect的代码块上。 举个例子:

  1. func breakDemo1() {
  2. BREAKDEMO1:
  3. for i := 0; i < 10; i++ {
  4. for j := 0; j < 10; j++ {
  5. if j == 2 {
  6. break BREAKDEMO1
  7. }
  8. fmt.Printf("%v-%v\n", i, j)
  9. }
  10. }
  11. fmt.Println("...")
  12. }

continue(继续下次循环)-当前循环

continue语句可以结束当前循环,开始下一次的循环迭代过程,仅限在for循环内使用。
continue语句后添加标签时,表示开始标签对应的循环。例如:

  1. func continueDemo() {
  2. forloop1:
  3. for i := 0; i < 5; i++ {
  4. // forloop2:
  5. for j := 0; j < 5; j++ {
  6. if i == 2 && j == 2 {
  7. continue forloop1
  8. }
  9. fmt.Printf("%v-%v\n", i, j)
  10. }
  11. }
  12. }

goto(跳转到指定标签)

goto语句通过标签进行代码间的无条件跳转。goto语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go语言中使用goto语句能简化一些代码的实现过程。 例如双层嵌套的for循环要退出时:

  1. // 需依次结束循环
  2. func gotoDemo1() {
  3. var breakFlag bool
  4. for i := 0; i < 10; i++ {
  5. for j := 0; j < 10; j++ {
  6. if j == 2 {
  7. // 设置退出标签
  8. breakFlag = true
  9. break
  10. }
  11. fmt.Printf("%v-%v\n", i, j)
  12. }
  13. // 外层for循环判断
  14. if breakFlag {
  15. break
  16. }
  17. }
  18. }

使用goto语句能简化代码:

  1. // 直接的跳转到指定的标签处
  2. func gotoDemo2() {
  3. for i := 0; i < 10; i++ {
  4. for j := 0; j < 10; j++ {
  5. if j == 2 {
  6. // 设置退出标签
  7. goto breakTag
  8. }
  9. fmt.Printf("%v-%v\n", i, j)
  10. }
  11. }
  12. return // ????
  13. // label标签
  14. breakTag:
  15. fmt.Println("结束for循环")
  16. }

练习题

九九乘法表

  1. // 第二个循环体从一开始,且j作为被乘数。可以做到竖排相同
  2. func () {
  3. // 正序
  4. for i := 1; i < 10; i++ {
  5. for j := 1; j <= i; j++ {
  6. fmt.Printf("%d * %d = %d\t", j, i, i*j)
  7. }
  8. fmt.Println()
  9. }
  10. // 倒序
  11. for i := 9; i > 0; i-- {
  12. for j := 1; j <= i; j++ {
  13. fmt.Printf("%d * %d = %d\t", j, i, i*j)
  14. }
  15. fmt.Println()
  16. }
  17. }