【Go语言】【8】GO语言的条件语句和选择语句

简介:
原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://qingkechina.blog.51cto.com/5552198/1618317

一、条件语句

条件语句即if-else语句,通常用来判断条件是否满足,下面通过猜价格游戏来了解条件语句:

1、猜价格游戏

假如有一件商品价格为81元,在[0,100]范围之内

系统请猜测者输入一个价格

猜测者:50

系统提示:低了

猜测者:87

系统提示:高了

猜测者:83

系统提示:高了

猜测者:81

系统提示:恭喜您猜对了

最终效果如下图:

wKiom1T6htSQ-26AAAC6fDkqqJY700.jpg


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,这段程序是编译不能通过呢?还是可以正常运行?

wKiom1T67OzhZIy9AAB23EjEGmA369.jpg

从作用域上来看,该程序可以正常运行,在if条件语句中值为10的变量a是不可见的,只能看到值为3的变量a,但出了条件语句值为10的变量a就变为可见的了,其作用域如下:

wKioL1T68FDgSy3eAADc5n-4hg0275.jpg


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

这并不是程序开发者所期望的y_0009.gif,但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")

}

wKioL1T7AI_T-P1rAABBI1I2wms590.jpg

我们定义了一个getValue()函数,并把返回值3赋值给变量i,显示这是一个表达式,同时i <= 2或i <= 5也是表达式。值得一提的是3 <= 5同时3 <= 8,但程序只打印出满足i <= 5的条件,然后就直接短路了。读者若想不让它直接短路该如何办?这就需要fallthrough关键字了


5、fallthrough关键字

在case执行体内添加fallthrough关键字的作用是,当该case执行体执行后,还可以向下执行符合的条件,具体见截图:

wKiom1T7ASuQR0tUAAL9F8rM21g534.jpg


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

目录
相关文章
|
13天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
14天前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
19天前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
23天前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
45 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
|
18天前
|
开发框架 前端开发 Go
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
156 7
|
15天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
28 3
|
1月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
80 20
|
15天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
19天前
|
存储 开发框架 Devops
eino — 基于go语言的大模型应用开发框架(一)
Eino 是一个受开源社区优秀LLM应用开发框架(如LangChain和LlamaIndex)启发的Go语言框架,强调简洁性、可扩展性和可靠性。它提供了易于复用的组件、强大的编排框架、简洁明了的API、最佳实践集合及实用的DevOps工具,支持快速构建和部署LLM应用。Eino不仅兼容多种模型库(如OpenAI、Ollama、Ark),还提供详细的官方文档和活跃的社区支持,便于开发者上手使用。
121 8
|
19天前
|
存储 算法 Go
Go语言实战:错误处理和panic_recover之自定义错误类型
本文深入探讨了Go语言中的错误处理和panic/recover机制,涵盖错误处理的基本概念、自定义错误类型的定义、panic和recover的工作原理及应用场景。通过具体代码示例介绍了如何定义自定义错误类型、检查和处理错误值,并使用panic和recover处理运行时错误。文章还讨论了错误处理在实际开发中的应用,如网络编程、文件操作和并发编程,并推荐了一些学习资源。最后展望了未来Go语言在错误处理方面的优化方向。