go语言分支语句、条件语句

举报
酷尔。 发表于 2022/04/01 10:02:31 2022/04/01
【摘要】 三大分支语句的语法,以及日常使用的注意点。

介绍go语言的分支语句有几种,以及如何使用


(一)分支语句概述

	总的来说有三类:
		if...elseif...else...
		
		switch...case...default...
		
		select....
	注意点:
		不支持三目运算符

		在使用&&,||时支持阻断机制(也就是说前面的语句可以满足整个条件时后面条件不再判断)

(二)细说分支语句

①if…elseif…else…
    值得注意的是:
    	(1)go语言if分支判断条件可以不加括号
   		(2)else或else if书写的时候不可以换行(五颗星)
		(3)每一个分支语句块都必须加{}加以限定,否则会编译出错
		(4)遇到匹配的条件进入执行,其余符合的条件将被阻断
	例如:
	a := 11
	// if else if else语句
	if a > 10 {
		fmt.Println("a大于10")
	} else if a < 10 {
		fmt.Println("a小于10")
	} else {
		fmt.Println("a等于10")
	}
②switch…case…default…
	值得注意的是:
		(1)switch语句与其他语言的区别是go语言的case语句不用加break语句
		找到匹配的项直接进行case然后执行完退出
		(2)并且go语言中case语句可以在一个case语句中可以捕获多个可满足的条件
		(3)case语句中可以使用fallthrough强制执行case后面的语句,无论是否满足条件
		执行的时候会从第一个满足条件的case语句向下执行,执行到没有fallthrough代码块后
		无论后面case是否满足条件都将跳出
		(4)switch语句中每一个case捕获到的类型要保持一致
		(5)不可以两个case捕获的条件相同
		(6)switch语句中不像if分支语句那样严格要求{}
正常的switch语句
	//switch判断一个变量的类型
	switch mytype := x.(type) {//后面学反射的时候会学这个b.(type)
	case nil:
		fmt.Printf(" x 的类型 :%T", i)//%T代表打印变量的类型
	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("未知型")
	}
使用fallthroughswitch语句
这里会一直执行打印到4case 条件语句为 true这一行
 	switch {
	case true:
		fmt.Println("1、case 条件语句为 false")
		fallthrough
	case true:
		fmt.Println("2、case 条件语句为 true")
		fallthrough
	case false:
		fmt.Println("3、case 条件语句为 false")
		fallthrough
	case false:
		fmt.Println("4、case 条件语句为 true")
	case true:
		{
			fmt.Println("5、case 条件语句为 false")
			fmt.Println("666")
		}
		fmt.Println("666")
		fallthrough
	default:
		{
			fmt.Println("123")
		}
	}
③select…
	select语句概述:
		select语句类似于用于通信的switch语句,每个case必须是一个通信操作,要么发送要么接收
	select运行机制:
		select语句会从通道内进行取值select会先检测那几个case符合筛选条件,如果有的话select就
		会在符合条件的case中选择一个进行执行如果没有一个case符合条件,就会选择default执行,
		如果没有default选项就会进入阻塞状态直至满足case条件,如果select被阻塞,其他线程没有
		被time.Sleep之外的阻塞所阻塞,则不会抛死锁异常如果select被阻塞,其他线程被time.Sleep之
		外的阻塞方式阻塞了,则抛出死锁异常
介绍select代码之前先简要概述一下通道(先声明后初始化,先进先出)
通道的长度决定了通道可以存放多少个数据(后面会详细介绍,这里就是为了理解select语句)
通道声明:
	只有一个位置的int型通道
	var a chan int
	a = make(chan int, 1)101个位置的int型通道
	var b chan int
	b = make(chan int, 101)
通道使用:
	存数据 a<-10(10存进了通道a内)
	取数据 i:=<-a(将a内的10取出放在变量i内)
1、测试随机性
测试select语句执行case条件的随机性,其中b是一个通道
	for i := 0; i < 10; i++ {
		select {
		case b <- i:
			fmt.Println("1号就绪!")
		case b <- i:
			fmt.Println("2号就绪!")
		case b <- i:
			fmt.Println("3号就绪!")
		case b <- i:
			fmt.Println("4号就绪!")
		case b <- i:
			fmt.Println("5号就绪!")
		case b <- i:
			fmt.Println("6号就绪!")
		case b <- i:
			fmt.Println("7号就绪!")
		case b <- i:
			fmt.Println("8号就绪!")
		case b <- i:
			fmt.Println("9号就绪!")
		}

	}
结果(随机打印):
		6号就绪!
		8号就绪!
		7号就绪!
		2号就绪!
		9号就绪!
		8号就绪!
		9号就绪!
		1号就绪!
		6号就绪!
		5号就绪!
2、测试可满足条件
开始通道a内没有数据,取数据时阻塞所以第一个条件不满足
必须先向a输入数据i才可以对a进行取值,所以先打印 投递成功!
又因为a是只能存放一个数据的通道,所以当a内有数据时打印i的值。
 	for i := 0; i < 10; i++ {
		select {
		case x := <-a:
			fmt.Println(x)
		case a <- i:
			fmt.Println("投递成功!")
		}
	}
结果:
		投递成功!
		0        
		投递成功!
		2        
		投递成功!
		4        
		投递成功!
		6        
		投递成功!
		8  

④Go语言中没有三目运算符


GO GO GO !

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。