一、条件语句
条件语句即if-else语句,通常用来判断条件是否满足,下面通过猜价格游戏来了解条件语句:
1、猜价格游戏
假如有一件商品价格为81元,在[0,100]范围之内
系统请猜测者输入一个价格
猜测者:50
系统提示:低了
猜测者:87
系统提示:高了
猜测者:83
系统提示:高了
猜测者:81
系统提示:恭喜您猜对了
最终效果如下图:
2、猜价格代码实现
package main
import (
聽 聽"fmt"
聽 聽"math/rand"
聽 聽"time"
)
func main() {
聽 聽randrom := rand.Intn(100)
聽 聽fmt.Println("请输入0至100范围内的整数价格")
聽 聽for {
聽 聽 聽 var input int
聽 聽 聽 fmt.Scanf("%d\n", &input)
聽 聽 聽 if input < randrom {
聽 聽 聽 聽 聽fmt.Println("低了")
聽 聽 聽 } else if input > randrom {
聽 聽 聽 聽 聽fmt.Println("高了")
聽 聽 聽 } else {
聽 聽 聽 聽 聽fmt.Println("恭喜您猜对了")
聽 聽 聽 聽 聽break
聽 聽 聽 }
聽 聽}
聽 聽time.Sleep(time.Second * 10)
}
3、代码解释
在GOROOT环境变量的src目录创建guess.go文件(GOROOT的介绍可参见《【1】windows操作系统下GO环境配置》)
package main
表示guess.go所属的包为main包,包是GO语言中的基本单位,要生成GO可执行程序,必须建立一个名称为main的包,并且该包中必须包含一个叫main()的函数,它是GO可执行程序的入口
import (
聽 聽"fmt"
聽 聽"math/rand"
聽 聽"time"
)
表示该程序引入三个依赖包,依次为fmt、math/rand和time。其中fmt即为GO的标准格式包,主要负责输入输出用的; math/rand是GO的math随机数包;time是GO的计时包,一般用于并发
func main() {
}
GO语言的main()函数,不能带参数,也不能定义返回值,并且一个包中只能有一个main()函数
randrom := rand.Intn(100)
这里调用了math/rand包中的Intn()函数,用于生成一个0~100范围内的整数,并把这个整数赋值给变量randrom
fmt.Println("请输入0至100范围内的整数价格")
调用fmt包中的Println()函数,输出提示信息
for {
}
无限循环,相当于其它语言的while,可能您会问:“哪为何不使用while”,很遗憾地告诉您:“GO语言实在太扣门了,它没有提供while关键字,它认为一个for就足够了”
var input int
fmt.Scanf("%d\n", &input)
界面停止等待猜测者输入价格,并把输入的价格赋值给input变量
if input < randrom {
聽 聽fmt.Println("低了")
} else if input > randrom {
聽 聽fmt.Println("高了")
} else {
聽 聽fmt.Println("恭喜您猜对了")
聽 聽break
}
如果输入价格低于随机数,系统则提示猜测者给的价格低了;若输入价格高于随机数,系统则提示猜测者给的价格高了;否则提示猜测正确,然后退出无限循环
time.Sleep(time.Second * 10)
猜测者猜对之后界面停止10秒后退出
4、条件语句的使用
此条件语句使用Java写应该如下:
if (input < randrom)
{
聽 聽System.out.println("低了")
}聽
else if (input > randrom)
{
聽 聽System.out.println("高了")
}
else
{
聽 聽System.out.println("恭喜您猜对了")
}
通过与Java语法对比,更能清楚地了解到GO语法
if或else if之后的条件不需要括号括起来
条件右侧的左大括号与条件必须在同一行
除此之外,GO语言的if之后还可以初始化表达式,例如:
if a := 1; a < 2 {
聽 聽 fmt.Println("if之后可以根初始化表达式")
}
if之后直接声明了一个变量a,并把1赋值给a,然后再判断变量a是否小于2,若小于2则打印出信息
5、条件语句中的变量作用域
func main() {
聽 聽a := 10
聽 聽if a := 3; a > 2 {
聽 聽 聽 fmt.Println("条件语句中变量a的值为", a)
聽 聽}
聽 聽fmt.Println("main()函数中变量a的值为", a)
}
在main()函数中声明了一个变量a并赋值为10,同时在条件语句if后面也声明了一个变量a并赋值为3,这段程序是编译不能通过呢?还是可以正常运行?
从作用域上来看,该程序可以正常运行,在if条件语句中值为10的变量a是不可见的,只能看到值为3的变量a,但出了条件语句值为10的变量a就变为可见的了,其作用域如下:
6、猜价格游戏的补充说明
聽 聽在使用Sublime text进行编译时,先按ctrl + b,然后输入go build guess.go(请注意:这里是build命令),这个命令可以生成一个guess.exe文件,然后双击打开该guess.exe文件即可。
聽 聽关于GO的命令行工具后面找个专门章节来介绍 :)
二、选择语句
这里的选择语句是指switch-case语句,有过其它语言开发经验的读者对此并不陌生
switch i {
case 0:
聽 聽fmt.Println("case 0")
case 1:
聽 聽fmt.Println("case 1")
case 2:
聽 聽fmt.Println("case 2")
case 3:
聽 聽fmt.Println("case 3")
case 4:
聽 聽fmt.Println("case 4")
case 5:
聽 聽fmt.Println("case 5")
default:
聽 聽fmt.Println("default")
}
1、没有break语句
其它大部分语言在每个case语句中要增加break,否则会出现问题,假设变量i的值为3,输出结果就会变为:
case 3
default
这并不是程序开发者所期望的,但GO就不会出现这类问题,当它匹配到3时就直接短路了,后面的语句就不再执行了
2、变量i的类型
拿Java为例,在JDK7之前变量i的值必须为char或int,不支持String,但对于GO来说不仅支持string,而且支持任何类型
3、支持合并
上例匹配条件可写为:
switch i {
case 0, 1, 2:
聽 聽fmt.Println("case 0 or 1 or 2")
case 3:
聽 聽fmt.Println("case 3")
case 4, 5:
聽 聽fmt.Println("case 4 or 5")
default:
聽 聽fmt.Println("default")
}
4、switch和case后面可以是表达式
switch i := getValue(); {
case i <= 2:
聽 聽fmt.Println("case 0 or 1 or 2")
case i <= 5:
聽 聽fmt.Println("case 3 or 4 or 5")
case i <= 8:
聽 聽fmt.Println("case 6 or 7 or 8")
default:
聽 聽fmt.Println("default")
}
我们定义了一个getValue()函数,并把返回值3赋值给变量i,显示这是一个表达式,同时i <= 2或i <= 5也是表达式。值得一提的是3 <= 5同时3 <= 8,但程序只打印出满足i <= 5的条件,然后就直接短路了。读者若想不让它直接短路该如何办?这就需要fallthrough关键字了
5、fallthrough关键字
在case执行体内添加fallthrough关键字的作用是,当该case执行体执行后,还可以向下执行符合的条件,具体见截图:
6、switch后面的条件可以去除
聽 聽 在上例中switch后面跟着i:=getValue();表达式,细心的读者估计已发现函数getValue()后面还有一个分号(;),若没这个分号GO编译器会报错。初次写这种表达式的人一开始可能很不舒服,所以GO语言提供了另外一种解决方案,即switch后面可以没有内容
i := getValue()
switch {
case i <= 2:
聽 聽fmt.Println("case 0 or 1 or 2")
case i <= 5:
聽 聽fmt.Println("case 3 or 4 or 5")
聽 聽fallthrough
case i <= 8:
聽 聽fmt.Println("case 6 or 7 or 8")
聽 聽fallthrough
default:
聽 聽fmt.Println("default")
}
这里把switch后面的内容清空了,但由于i值还需要存在,所以把i:=getValue()提到了switch的前面,这样switch-case内就可以访问变量i了
通过switch选择语句,读者一定能再次体会到GO语言的灵活性了吧 :)
本文出自 “青客” 博客,请务必保留此出处http://qingkechina.blog.51cto.com/5552198/1618317
有疑问加站长微信联系(非本文作者)