一、条件语句

条件语句即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语言的灵活性了吧 :)