go语言条件语句

Go条件语句

Go 语言条件语句

条件语句在流程中起 过滤 和 控制开关 的作用

条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句。

Go 语言提供了以下几种条件判断语句:

语句描述
if 语句if 语句 由一个布尔表达式后紧跟一个或多个语句组成。
if...else 语句if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。
if 嵌套语句你可以在 ifelse if 语句中嵌入一个或多个 ifelse if 语句。
switch 语句switch 语句用于基于不同条件执行不同动作。
select 语句select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。(通常会应用在通信信道上)

Go 语言 if 语句

if 语句由布尔表达式后紧跟一个或多个语句组成。

语法

Go 编程语言中 if 语句的语法如下:

// if 语句,后面的表达式产生的结果只能有两种: True 或者False
if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
}

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则不执行。

流程图如下:

G2XHghEwpDrpgWcg__original

//使用if 判断一个数变量的大小
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)
}

//输出结果:
a 小于 20
a 的值为 : 10
// 考试成绩及格,就送一个苹果。 并且,还要输出考试成绩

package main

import "fmt"

func main() {
	// 定义变量source ,作为考试成绩
	var source = 88
	
	if source >= 60 {
		fmt.Println("你及格了,奖励你一个苹果.")
	}
	fmt.Println("成绩是:", source)

}

//输出结果
你及格了,奖励你一个苹果.
成绩是: 88

Go 语言 if...else 语句

if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。

语法

Go 编程语言中 if...else 语句的语法如下:

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

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则执行 else 语句块。

流程图如下:

img

// 使用if else 判断一个数的大小
package main

import "fmt"

func main() {
   /* 局部变量定义 */
   var a int = 100;
 
   /* 判断布尔表达式 */
   if a < 20 {
       /* 如果条件为 true 则执行以下语句 */
       fmt.Printf("a 小于 20\n" );
   } else {
       /* 如果条件为 false 则执行以下语句 */
       fmt.Printf("a 不小于 20\n" );
   }
   fmt.Printf("a 的值为 : %d\n", a);

}

//以上代码执行结果为:
a 不小于 20
a 的值为 : 100
// 考试成绩及格,就送一个苹果,如果不合格则罚抄课文。 并且,还要输出考试成绩

package main

import "fmt"

func main() {
	// 定义变量source ,作为考试成绩
	var source = 55

	if source >= 60 {
		fmt.Println("你及格了,奖励你一个苹果.")
	} else {
		fmt.Println("你没有及格,你需要罚抄课文")
	}
	fmt.Println("成绩是:", source)

}

//输出结果:
你没有及格,你需要罚抄课文
成绩是: 55

Go 语言 if 语句嵌套

你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。

语法

Go 编程语言中 if...else 语句的语法如下:

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

你可以以同样的方式在 if 语句中嵌套 else if...else 语句

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 100
   var b int = 200
 
   /* 判断条件 */
   if a == 100 {
       /* if 条件语句为 true 执行 */
       if b == 200 {
          /* if 条件语句为 true 执行 */
          fmt.Printf("a 的值为 100 , b 的值为 200\n" );
       }
   }
   fmt.Printf("a 值为 : %d\n", a );
   fmt.Printf("b 值为 : %d\n", b );
}

//输出结果:
a 的值为 100 , b 的值为 200
a 值为 : 100
b 值为 : 200
//田径比赛,成绩在10s或者10s内,则进入决赛。进入决赛后,根据性别定义男子组,女子组
package main

import "fmt"

func main() {
	var (
		//定义比赛秒数
		sec = 8.8
		sex = "boy"
	)
	// 外层条件判断,决定是否进入决赛
	if sec <= 10 {
		fmt.Println("恭喜你,进入了决赛")
		// 内层条件判断,决定分组
		if sex == "boy" {
			fmt.Println("你进入了男子组")
		} else {
			fmt.Println("你进入了女子组")
		}
	} else {
		fmt.Println("你没有进入决赛")
	}
  /*  方法二:
  	if sec <= 10 && sex == "boy" {
		fmt.Println("你进入了决赛", "\n分配到了男子组")
	}
	if sec <= 10 && sex == "girl" {
		fmt.Println("你进入了决赛", "\n分配到了女子组")
	}
	if sec > 10 {
		fmt.Println("你没有进入决赛")
	}
  */
  
}

//输出结果:
恭喜你,进入了决赛
你进入了男子组

Go 语言 switch 语句

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。

switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。

switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough

语法

Go 编程语言中 switch 语句的语法如下:

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

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。

您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。

流程图:

JhOEChInS6HWjqCV

//根据菜单,选择相应的项目
package main

import "fmt"

func main() {
	// 定义一个变量
	var menu = 2
	//根据menu的值,进行匹配
	switch menu {
	case 1:
		fmt.Println("跳舞")
	case 2:
		fmt.Println("唱歌")
	case 3:
		fmt.Println("小品")
	default:
		fmt.Println("请重新选择")

	}
}


//输出结果;
唱歌
// 根据学生成绩进行等级考评.90-100:优秀;80-89:良好;60-79:合格;60一下不及格
package main

import "fmt"

func main() {
	var source = 84
	switch {
	case source >= 90 && source <= 100:
		fmt.Println("优秀")
	case source >= 80 && source <= 89:
		fmt.Println("良好")
	case source >= 60 && source <= 79:
		fmt.Println("合格")
		// 以上都不匹配,则进入到default中
	default:
		fmt.Println("不及格")
	}
}

// 输出结果:
良好
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"
      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 );      
}

//输出结果:
优秀!
你的等级是 A

Type Switch

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

Type Switch 语法格式如下:

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

import "fmt"

func main() {
  //引入空接口
   var x interface{}
    
  //判断接口类型。  注意type 只能搭配switch 使用。如果想单独使用输出数据类型,需要使用反射
   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>
//使用switch + type 判断数据类型
package main

import (
	"fmt"
)

/*使用type 和switch 语句判断数据类型*/
func main() {
	var number = 10
	make_type(number)
}

// 定义判断的函数
func make_type(x interface{}) {
	//判断接口类型。注意type 只能搭配switch 使用。如果想单独使用输出数据类型,需要使用反射
	switch i := x.(type) {
	case nil:
		fmt.Printf("数据类型是:%T", i)
	case int:
		fmt.Printf("数据类型是:%T", i)
	case float32, float64:
		fmt.Printf("数据类型是:%T", i)
	case string:
		fmt.Printf("数据类型是:%T", i)
	case bool:
		fmt.Printf("数据类型是:%T", i)
	default:
		fmt.Printf("数据类型是不明确")
	}
}

//输出结果:
数据类型是:int
//使用反射判断数据类型
package main

import (
	"fmt"
	"reflect"
)

/*反射,判断数据类型*/
func main() {
	var number = 10
	fmt.Println("number 的数据类型:", reflect.TypeOf(number))
}

//输出结果:
number 的数据类型: int

fallthrough

使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。

package main

import "fmt"

func main() {

    switch {
    // 因为是false,所以不会执行此段语句。即使写了fallthrough也不会生效
    case false:
            fmt.Println("1、case 条件语句为 false")
            fallthrough
    //因为条件是true,所以会执行此段语句。fallthrough会生效。下一条语句,不管结果是否为true都会执行  
    case true:
            fmt.Println("2、case 条件语句为 true")
            fallthrough
    //由于上一条语句里的fallthrough生效,所以此段会执行,此段里的fallthrough会生效 
    case false:
            fmt.Println("3、case 条件语句为 false")
            fallthrough
    //由于上一段的fallthrough,所以,此段会被执行。由于此段没有fallthrough,所以,下一段不会执行。switch  语句结束
    case true:
            fmt.Println("4、case 条件语句为 true")
    case false:
            fmt.Println("5、case 条件语句为 false")
            fallthrough
    default:
            fmt.Println("6、默认 case")
    }
}

//输出结果:
2、case 条件语句为 true
3、case 条件语句为 false
4、case 条件语句为 true
package main

import "fmt"

func main() {
	switch {
	case false:
		fmt.Println("1,false")
		fallthrough
	case true:
		fmt.Println("2,true")
		fallthrough
	case false:
		fmt.Println("3,false")
		fallthrough
  // 此段没有fallthrough  
	case true:
		fmt.Println("4,true")
  //由于上一段没有fallthrough,所以switch语句执行到上一段已经匹配,switch语句结束。所以,尽管此段条件为true,也不会执行  
	case true:
		fmt.Println("5,true")
		fallthrough
	default:
		fmt.Println("6,default")
	}
}

//输出结果:
2,true
3,false
4,true

从以上代码输出的结果可以看出:switch 从第一个判断表达式为 true 的 case 开始执行,如果 case 带有 fallthrough,程序会继续执行下一条 case,且它不会去判断下一个 case 的表达式是否为 true。

Go 语言 select 语句

select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。

select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。

语法

Go 编程语言中 select 语句的语法如下:

select {
    case communication clause  :
       statement(s);      
    case communication clause  :
       statement(s);
    /* 你可以定义任意数量的 case */
    default : /* 可选 */
       statement(s);
}

以下描述了 select 语句的语法:

  • 每个 case 都必须是一个通信

  • 所有 channel 表达式都会被求值

  • 所有被发送的表达式都会被求值

  • 如果任意某个通信可以进行,它就执行,其他被忽略。

  • 如果有多个 case 都可以运行,Select 会随机公平地选出一个执行。其他不会执行。

    否则:

    1. 如果有 default 子句,则执行该语句。
    2. 如果没有 default 子句,select 将阻塞,直到某个通信可以运行;Go 不会重新对 channel 或值进行求值。
package main

import "fmt"

func main() {
   var c1, c2, c3 chan int
   var i1, i2 int
   select {
      case i1 = <-c1:
         fmt.Printf("received ", i1, " from c1\n")
      case c2 <- i2:
         fmt.Printf("sent ", i2, " to c2\n")
      case i3, ok := (<-c3):  // same as: i3, ok := <-c3
         if ok {
            fmt.Printf("received ", i3, " from c3\n")
         } else {
            fmt.Printf("c3 is closed\n")
         }
      default:
         fmt.Printf("no communication\n")
   }    
}

//输出结果:
no communication
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值