[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 ...
随机推荐
- 【前端】Html5浏览器缓存 sessionStorage 与 localStorage
一.sessionStorage: 浏览关闭会话结束就被清除:(不能跨页面) localStorage:永久保存: 二.使用 var storage = window.sessionStorage; ...
- flask搭建
1.定义路由app.py from flask import Flask, request from flask import Blueprint app = Flask(__name__) test ...
- [BZOJ2761][JLOI2011]不重复数字 暴力
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2761 直接暴力. #include<cstdio> #include<c ...
- this的试题
1.var x=12; function test(){ console.log(this.x) } test() //主体是window 2.var x=12; function test ...
- /usr/bin/install -c -m 644 sample-config/httpd.conf /etc/httpd/conf.d/nagios.conf
[root@localhost nagios]# make install-webconf/usr/bin/install -c -m 644 sample-config/httpd.conf /et ...
- iOS逆向实战与工具使用(微信添加好友自动确认)
iOS逆向实战与工具使用(微信添加好友自动确认) 原文链接 源码地址 WeChatPlugin-iOS Mac OS 版微信小助手(远程控制.消息防撤回.自动回复.微信多开) 一.前言 本篇主要实现在 ...
- php用面向对象从mysql取数据
<?php //建立数据库的链接@$_mysqli = new mysqli('localhost','root','123456','dbname');if(mysqli_connect_er ...
- PHP一句话后门过狗姿势万千之后门构造与隐藏
第二章节主要带给大家一些后门构造思路,与安全狗文件特征检测的机制. 另外强调一下,这篇文章需要大家对于php有一定的认识. 本章节分为三大部分,第一部分针对初级,分析菜刀php代码的执行过程,较基础: ...
- About the iOS File System
两个维度: 1)是否给用户使用: 2)是否持久存储. During installation of a new app, the installer creates a number of conta ...
- centos7 搭建双网卡bond1(主备模式)实例
前景须知: 在redhat6 中网卡叫bond,在redhat7及centos7中改名team,此处只记录centos7中双网卡主备搭建过程. 应用情景:实现网络的高可用,防止一条网线或交换机故障影响 ...