golang第十天,流程控制(上篇)

119 阅读4分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

流程控制是什么

程序的执行顺序

if分支语句

1. 程序的流程结构

程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构

  • 顺序结构:从上到下,逐行执行
  • 选择结构:条件满足,某些代码才会执行
  • 分支语句:if,switch,select
  • 循环结构:条件满足,某些代码会被反复的执行多次
  • 循环语句:for语句

2. 条件语句

if语句

语法格式:

if 布尔表达式 {
    // 在布尔表达式为true时执行
}

if 布尔表达式 {
    // 在布尔表达式为true时执行
} else {
    // 在布尔表达式为false时执行
}

if 布尔表达式 {
    // 在布尔表达式为true时执行
} else if{
    // 在布尔表达式为false时执行
} else {
    // 在布尔表达式都为false时执行
}

示例代码:

package main
import "fmt"
func main() {
    // 定义局部变量
    var a int = 10
    
    // 使用if语句判断布尔表达式
    if a < 20 {
        // 如果条件为true时执行以下语句
        fmt.Printf("a 小于20\n")
    }
    fmt.printf("a的值为: %d\n", a)
}

if变体

如果其中包含一个可选的语句组件(在评估条件之前执行),则还有一个变体,它的语法是:

if statement; condition {
    
}
if condition {
 
}

示例代码:

package main
import "fmt"
func main() {
    if num := 10; num % 2 == 0 {
        fmt.Println(num, "is even")
    } else {
        fmt.Println(num, "is odd")
    }
}

注意: num的定义在if里,那么只能够在该if...else...语句块中使用,否则编译器会报错的。

打开某一个文件不存在或者由于权限的问题无法操作,这种使用方式,在go语言普遍存在,推荐这种方式书写

if file, err := os.Open("xxx.txt"); err != nil {
    // null
    fmt.Println(file)
    fmt.Println(err.Error())
   } else {
    fmt.Println("获取xxx.txt成功")
}

switch条件语句

switch是一个条件语句,它计算表达式并将其与可能匹配的列表进行比较,并根据匹配执行代码块。它可以被认为是一种惯用的方式来写多个if else子句。

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。

而如果switch没有表达式,它会匹配true

Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch, 但是可以使用fallthrough强制执行后面的case代码。

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。 您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。

switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

示例代码:

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var grade string = "B"
   var marks int = 90

   switch marks {
      case 90: grade = "A"
      case 80: grade = "B"
      case 50,60,70 : grade = "C"  //case 后可以由多个数值
      default: grade = "D"  
   }

   switch {
      case grade == "A" :
         fmt.Printf("优秀!\n" )     
      case grade == "B", grade == "C" :
         fmt.Printf("良好\n" )      
      case grade == "D" :
         fmt.Printf("及格\n" )      
      case grade == "F":
         fmt.Printf("不及格\n" )
      default:
         fmt.Printf("差\n" );
   }
   fmt.Printf("你的等级是 %s\n", grade );      
}

falthrough 贯通后续

package mai
import "fmt"
type data [2]int
func main() {
    switch x := 5; x {
    default:
        fmt.Println(x)
    case 5:
        x += 10
        fmt.Println(x)
        fallthrough
    case 6:
        x += 20
        fmt.Println(x)
    }
}

运行结果:

image.png

case中的表达式是可选的,可以省略。如果该表达式被省略,则被认为是switch true,并且每个case表达式都被计算为true,并执行相应的代码块。

示例代码:

package main
import "fmt"

func main() {  
    num := 75
    switch { // expression is omitted
    case num >= 0 && num <= 50:
        fmt.Println("num is greater than 0 and less than 50")
    case num >= 51 && num <= 100:
        fmt.Println("num is greater than 51 and less than 100")
    case num >= 101:
        fmt.Println("num is greater than 100")
    }
}

image.png

switch的注意事项

  1. case后的常量值不能重复
  2. case后可以有多个常量值
  3. fallthrough应该是某个case的最后一行。如果它出现在中间的某个地方,编译器就会抛出错误。

type switch

switch语句还可以被用于type-switch来判断某个interface变量中实际存储的变量类型

switch x.(type){
    case type:
       statement(s);      
    case type:
       statement(s); 
    /* 你可以定义任意个数的case */
    default: /* 可选 */
       statement(s);
}
package main

import "fmt"

func main() {
   var x interface{}

   switch i := x.(type) {
      case nil:   
         fmt.Printf(" x 的类型 :%T",i)                
      case int:   
         fmt.Printf("x 是 int 型")                       
      case float64:
         fmt.Printf("x 是 float64 型")           
      case func(int) float64:
         fmt.Printf("x 是 func(int) 型")                      
      case bool, string:
         fmt.Printf("x 是 bool 或 string 型" )       
      default:
         fmt.Printf("未知型")     
   }   
}

运行结果: x的类型为nil

image.png

最后

刚学golang,希望大家监督并且一起努力

有兴趣的小伙伴,欢迎关注我订阅号:EntrepreneurialG