[Go]条件语句
package main import (
"io/ioutil"
"fmt"
) //条件语句
//if的条件语句不需要括号
//if的条件里可以赋值,if的条件里赋值的变量作用域就在这个if语句里
//switch会自动break,除非使用fallthrough func grade( score int ) string {
g := ""
switch { //switch里面可以没有表达式
case score < || score >:
panic(fmt.Sprintf( "Wrong score: %d", score) ) //中断程序执行,报错
case score < :
g = "F"
case score < :
g = "C"
case score < :
g ="B"
case score <= :
g ="A"
}
return g
} func main() {
const filename = "abc.txt"
/* contents, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println(err)
}else {
fmt.Printf("%s\n", contents)
}*/
//或者也可以用写成下面这样
if contents, err := ioutil.ReadFile(filename); err != nil{ //contents和err 定义在if里,生存期只在if里面才有
fmt.Println(err) //open abc.txt: The system cannot find the file specified.
}else {
fmt.Printf("%s\n", contents)
} fmt.Println(
grade( ), //F
grade( ), //F
grade( ), //A
grade(), //A
)
}
上面介绍了switch语句中switch表达式和case表达之间有着怎样的联系?
switch表达式的结果值与某个case表达式中任意一个子表达式的结果值相等,该case表达式所属的case子句就会被选中,并且一旦某个case子句被选中,其中的附带在case表达式后边的那些语句就会被执行,同时其他的所以case子句都会被忽略(如果被选中的Case子句附带的语句列表中包含了fallthrough语句,那么紧挨在它下边的那个case子句附带的语句也会被执行)
正因为存在判断相等的操作,switch语句对switch表达式的结果类型,以及各个Case表达式中子表达式的结果类型都是有要求的(Go语言中,只有类型相同的值之间才有可能被允许进行判等操作)
value1 := [...]int8{, , , , , , }
switch + { // 这条语句无法编译通过。
case value1[], value1[]:
fmt.Println("0 or 1")
case value1[], value1[]:
fmt.Println("2 or 3")
case value1[], value1[], value1[]:
fmt.Println("4 or 5 or 6")
}
上面的代码中,1+3的求值结果是无类型的常量4,这个常量会被自动地转换为此种常量的默认类型的值,比如整数4的默认类型是int,浮点数3.14的默认类型是float64
因此上面的switch表达式的结果类型是int,而那些case子表达式的结果类型却是int8,它们类型不同,是无法通过编译的
再看下面这段代码的switch表达式的结果值是int8类型的,那些case表达式中的结果值是无类型的常量,却是可以编译的
value2 := [...]int8{, , , , , , }
switch value2[] {
case , :
fmt.Println("0 or 1")
case , :
fmt.Println("2 or 3")
case , , :
fmt.Println("4 or 5 or 6")
这是因为如果case表达式中子表达式的结果值是无类型的常量,那么它的类型会被自动地转换为swicth表达式的结果类型,又由于上述那几个整数都可以被转换为int8类型的值么,所以对这些表达式的结果值进行判等操作是没有问题的
即Swicth语句会进行有限的类型转换,但不能保证这种转换可以统一它们的类型
switch语句对它的case表达式还有哪些约束?
1)switch语句不允许case表达式中的子表达式结果值存在相等的情况
value3 := [...]int8{, , , , , , }
switch value3[] { // 这条语句无法编译通过。
case , , :
fmt.Println("0 or 1 or 2")
case , , :
fmt.Println("2 or 3 or 4")
case , , :
fmt.Println("4 or 5 or 6")
}
但是这个约束只针对结果值为常量的子表达式,比如1+1和2不能同时出现。但是也就可以想办法绕过这个对子表达式的限制了,下面的代码就可以绕过限制
value5 := [...]int8{, , , , , , }
switch value5[] {
case value5[], value5[], value5[]:
fmt.Println("0 or 1 or 2")
case value5[], value5[], value5[]:
fmt.Println("2 or 3 or 4")
case value5[], value5[], value5[]:
fmt.Println("4 or 5 or 6")
}
但是上面这种绕过方式对用于类型判断的switch语句无效,因为类型switch语句中的case表达式的子表达式必须直接由类型字面量表示,而无法通过间接的方式表示。
value6 := interface{}(byte())
switch t := value6.(type) { // 这条语句无法编译通过。
case uint8, uint16:
fmt.Println("uint8 or uint16")
case byte:
fmt.Printf("byte")
default:
fmt.Printf("unsupported type: %T", t)
}
这里byte是uint8类型的别名类型,它们本质上是同一个类型,只是类型名称不同,因此是无法通过编译的
[Go]条件语句的更多相关文章
- Python —条件语句
条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(null ...
- php简写表达式,&& or || 缩写条件语句
有时候学的多了, 好多小细节 都忘了 ,比如 简单的表达式, 三元表达式 ?:; $aa or $bb 表达式 等等! 写一些简单的表达式,备忘! php用&&和||缩写条件语句 ...
- java中的条件语句(if、if...else、多重if、嵌套if)
Java条件语句之 if 生活中,我们经常需要先做判断,然后才决定是否要做某件事情.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE 5S .对于这种"需要先判断条件,条件满足后才 ...
- javascript语句——条件语句、循环语句和跳转语句
× 目录 [1]条件语句 [2]循环语句 [3]跳转语句 前面的话 默认情况下,javascript解释器依照语句的编写顺序依次执行.而javascript中的很多语句可以改变语句的默认执行顺序.本文 ...
- go语言条件语句 if else
示例: if a < 5 { return 0 } else { return 1 } 关于条件语句,需要注意以下几点: 条件语句不需要使用括号将条件包含起来(): 无论语句体内有几条语 ...
- Todd's Matlab讲义第4讲:控制误差和条件语句
误差和残量 数值求解方程\(f(x)=0\)的根,有多种方法测算结果的近似程度.最直接的方法是计算误差.第\(n\)步迭代结果与真值\(x^\*\)的差即为第\(n\)步迭代的误差: \begin{e ...
- 5-python学习——条件语句
5-python学习——条件语句 5-python学习——条件语句 条件语句if else形式 if else条件语句说明 测试一下 编程语言一般都由这么几个部分组成 变量 条件分支语句 循环语句 函 ...
- Python基础6- 流程控制之if条件语句
Python条件语句是通过判断一条或多条条件语句的执行结果来决定执行哪条代码块的.Python 中if 语句用于控制程序的执行,基本形式为:if 判断条件: 执行语句……else: 执行语句…… #c ...
- Jade之条件语句
条件语句 jade支持js中的if/elseif/else语法. jade: - var user = { description: 'foo bar baz' } - var authorised ...
- 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等
[源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native ...
随机推荐
- mysql 三大范式【转载】
第一范式(1NF,normal format):字段不能再分. 这是字段的原子性.例如:字段“学期时间”:2014-9-1,2015-1-15. 这个字段“学期时间”可以再分为“学期开始时间”,201 ...
- Asp.Net MVC中捕捉错误路由并设置默认Not Found页面。
在Global中写一个Application_Error捕捉错误路由并重定向到Not Found页面.这里是全局性抓取错误路由,此处还可以写由错误路由导致访问失败的日志记录. protected vo ...
- 【学习笔记】深入理解js原型和闭包(18)——补充:上下文环境和作用域的关系
本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...
- 手把手教写devops全栈自动化工具(django2.1)
简单介绍一下自己之前写的一个全栈项目,框架用的是django2.1版本 主要对paramiko模块,salstack的API二次开发. 核心组件包括:MQ,mysql,websocket,redis, ...
- ios app跳转拨打电话界面,调用拨打电话功能
DNLogFUNC //两种方法都可以用 //这种据说是可以上appstore NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithF ...
- java (给出年月日,计算该日是该年的第n天 )
package com.ywx.testdemo01; import java.util.Scanner; /** * 题目:给出年月日,计算该日是该年的第n天 * @author yangwenxu ...
- 你的项目刚刚启动?是时候考虑Globalization了!
今天继续由SAP成都研究院非典型程序猿, 菜园子小哥王聪给大家带来分享. 关于这个很长的定语的由来,请参考这篇文章,里面有王聪的背景介绍,包括他种菜的特长:当我用UI5诊断工具时我用些什么. 秋天到了 ...
- 闲着蛋疼没事干,写个Mac端的Kcptun Client管理器
原理: 执行一行脚本 输入服务器地址,端口,密码等做了图形化编辑 可以控制Kcptun是否正在运行 App已上传github https://github.com/nicky2k8/KcptunCli ...
- vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示
vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示 https://cn.vuejs.org/v2/guide/class-and-sty ...
- 看云&gitbook 写帮助文档 | 专注于文档在线创作、协作和托管
看云 写帮助文档 | 专注于文档在线创作.协作和托管 https://www.kancloud.cn/manual/thinkphp/1678 https://www.gitbook.com/