Go语言基础之4--流程控制

一、if else语句

1.1 基本语法1

语法1

if condition {
//do something
}

语法2:

if condition {
//do something
} else {
//do something
}

语法3

if condition {
//do something
} else if condition {
//do something
} else {
//do something

1.2 练习1

package mainimport ("fmt"
)func main() {num := 10if num%2 == 0 {fmt.Println("the number is even")} else {fmt.Println("the number is odd")}
}

 执行结果如下:

1.3 基本语法2

if statement(语句); condition {
}

1.4 练习2

package mainimport ("fmt"
)func main() {if num := 10;num%2 == 0 {fmt.Println("the number is even")} else {fmt.Println("the number is odd")}
}

 执行结果如下:

1.5 练习3

package mainimport ("fmt"
)func main() {num := 99if num <= 50 {fmt.Println("number is less than or equal to 50")} else if num >= 51 && num <= 100 {fmt.Println("number is between 51 and 100")} else {fmt.Println("number is greater than 100")}
}

 执行结果如下:

二、 循环

2.1 Go语言中只有一种循环,就是for循环

基本语法:

for initialisation(初始化变量); condition(条件判断); post(变量修改) {
}

 

2.1 练习1

package mainimport ("fmt"
)func main() {for i := 1; i <= 10; i++ {fmt.Printf("%d", i)}
}

 执行结果如下:

2.3 break,终止循环

一句话说:break就是终止本层的循环

2.4 练习2(break)

package mainimport ("fmt"
)func main() {for i := 1; i <= 10; i++ {if i > 5 {break //loop is terminated if i > 5
        }fmt.Printf("%d ", i)}fmt.Printf("\nline after for loop")
}

执行结果如下:

2.5 continue,终止本次循环

一句话,continue是终止此次循环(跳过本次)。

2.6 练习3(continue)

package mainimport ("fmt"
)func main() {for i := 1; i <= 10; i++ {if i%2 == 0 {continue}fmt.Printf("%d ", i)}
}

 执行结果如下:

2.7 练习4

package mainimport ("fmt"
)func main() {i := 0for ;i <= 10; { // 初始化变量和变量修改也可以在这一行忽略,将初始化变量写到for循环外,变量修改写到for循环外,";"可以省略也可以写上fmt.Printf("%d ", i)i += 2}
}

 执行结果如下:

2.8 练习5

package mainimport ("fmt"
)func main() {for no, i := 10, 1; i <= 10 && no <= 19; i, no = i+1, no+1 {fmt.Printf("%d * %d = %d\n", no, i, no*i)}
} 

执行结果如下:

2.9 无限循环

就是for循环不写任何条件

2.10 练习6(无限循环)

package mainimport ("fmt"
)func main() {for {  //for循环不加任何条件即为无限循环fmt.Printf("hello")}
}

 

执行结果如下:

package mainimport ("fmt"
)func main() {for {  //for循环不加任何条件即为无限循环fmt.Printf("hello")}
}

 执行结果如下:

尴尬的是:vscode也跑挂了。

三、 switch语句

3.1 switch语句语法

switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止。。

switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break

基本语法是:

switch var1 {case val1:...case val2:...default:...
}

 解释:

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。也可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3。default是默认值,可以写也可以不写。

 

switch语句流程图如下:

 

3.2 练习1(不加default)

package mainimport ("fmt"
)func main() {finger := 4switch finger {case 1:fmt.Println("Thumb")    //此处写多行语句也可以case 2:fmt.Println("Index")case 3:fmt.Println("Middle")case 4:fmt.Println("Ring")case 5:fmt.Println("Pinky")}
}

 执行结果如下:

3.3 练习2(switch default)

package mainimport ("fmt"
)func main() {switch finger := 8; finger {case 1:fmt.Println("Thumb")case 2:fmt.Println("Index")case 3:fmt.Println("Middle")case 4:fmt.Println("Ring")case 5:fmt.Println("Pinky")default: //default case,当上述case选项都不符合时,执行这里语句fmt.Println("incorrect finger number")}
}

 执行结果如下:

3.4 练习3(case值为多个条件)

package mainimport ("fmt"
)func main() {letter := "i"switch letter {case "a", "e", "i", "o", "u":fmt.Println("vowel")default:fmt.Println("not a vowel")}
}

 执行结果如下:

3.5 练习4(case条件判断)

package mainimport ("fmt"
)func main() {num := 75switch { // expression is omitted(表达式省略掉了)case num >= 0 && num <= 50:fmt.Println("num is greater than 0 and less than 50")case num >= 51 && num <= 100:fmt.Println("num is greater than 51 and less than 100")case num >= 101:fmt.Println("num is greater than 100")}
}

 执行结果如下:

3.6 练习4(fallthrough)

switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break,如果case1已经满足条件了,但是还想执行case2的话,我们可以通过使用fallthrough关键字,同理如果还想继续执行case3的话,那我们可以接着使用fallthrough

实例如下:

package mainimport ("fmt"
)func number() int {num := 15 * 5return num
}
func main() {switch num := number(); { //num is not a constantcase num < 50:fmt.Printf("%d is lesser than 50\n", num)fallthroughcase num < 100:fmt.Printf("%d is lesser than 100\n", num)fallthroughcase num < 200:fmt.Printf("%d is lesser than 200", num)}
}

执行结果如下:

四、 练习题

生成一个随机数,让一个用户去猜这个数是多少?

代码示例如下:

package mainimport ("fmt""math/rand" //math包中的rand函数可以用来生成随机数"time"
)func main() {var number int/*for i := 0;i < 10; i++ {number = rand.Intn(100)fmt.Printf("number:%d\n",number)}因为伪随机的存在,rand生成的随机数都有一个固定的序列,比如第一次生成1,第二次生成20等等,随机数的序列是固定,我们可以通过给其一个随机的总值,如果随机的总值不一样,那么伪随机数的序列也不一样。我们不给,他就是按照一个默认的随机总值,所以伪随机数序列永远是一样的。*/rand.Seed(time.Now().UnixNano()) //通过rand函数的Seed方法,来设置总值,这里我们以当前时间来设置总值,并且用的纳秒,十分精确了number = rand.Intn(100)          //随机数的范围是0-100,但不包括100fmt.Printf("请猜一个数字,数字的范围是:[0-100)\n")for { //因为并不知道用户什么时候输入正确,所以是没有限制条件的,我们只能做一个死循环,配合switch语句满足条件了即可退出;var input intfmt.Scanf("%d\n", &input) //Scanf表示让用户输入,Scanf从终端读取一个整数,并传值给input变量,&表示获取到该变量内存地址var flag bool = false     //通过设置flag变量,解决的是用户输入正确后可以退出
        switch {case number > input:fmt.Printf("您输入的数字太小\n")case number == input:fmt.Printf("恭喜您,答对了!\n")flag = truecase number < input:fmt.Printf("您输入的数字太大\n")}if flag { //表示如果flag为真,则break退出这个for循环
            break}}
} 

执行结果如下:

 

补充:

Scanf哪里一定要加上\n,因为加上的话就已经表示以回车换行符为止,这样就已经保证了能够获取到用户输入的真正的数字,你如果不加\n,他就不行了,就会识别2次一个是你输入的数字,一个是回车。

4.2 补充1:

为什么等待用户输入的变量要加上&符号?

答:

如果我们去掉&,不传入地址的话,我们是修改不了input的变量的值,假如我传入一个test值进去,因为数据类型时int,其也就是值类型,这一次传值,其内部就相当于拷贝了一份,这一份我们就可以称其为b1,我们修改的仅仅是b1的值,并不是外面input变量的值,input变量的值并没有修改。

4.3 补充2:

针对Go语言中基本数据类型是值类型的实例:

package mainimport ("fmt"
)func main() {var a int = 100var b intb = ab = 200fmt.Printf("a=%d,b=%d, a=%p, b=%p", a, b, &a, &b)
}

 执行结果:

解释:

变量a赋值100,变量b暂未赋值,然后将a变量复制给b,此时b为100,下面又重新为b变量赋值200,最终输出结果a为100,b为200。因为a和b都是值类型,所以a和b的内存地址都是相互独立的,如果不是独立的,那么当b重新赋值为200时,a也应该是200了,但是a为100,也充分证明了,a和b的内存地址是相互独立的。

4.4 补充3

1)Go语言中的基本数据类型都是值类型。

     值类型:定义一个变量a,在定义一个变量b,将 a=b(b赋值给a),对于值类型来说,此时虽然b赋值给a了,但是a和b依然是两块独立的内存地址

2)我们都知道设置变量是为了我们去方便操作内存,在底层其都是一个个内存地址,我们cpu寻址的话,都是通过内存地址去寻址的,打印出来的内存地址都是16进制的串。比如说变量a=100,在计算机内部,      我们是通过内存地址找到那块内存,然后那块内存是int类型,其占4个字节,找到那块内存,找到那4个字节,然后把100存进去就可以了,go语言就是这样比较原始。

转载于:https://www.cnblogs.com/forever521Lee/p/9298871.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大家都挺难的​

这是昨天小号发的一个推文小时候觉得读书苦 但是现在想想&#xff0c;如果那时候跟现在一样用功 考上北大清华都没问题然后想到跟我家小云聊天的内容&#xff0c;挺有感触的。小云最近在我们小区的业委会上班&#xff0c;业委会在我家旁边&#xff0c;上班就是从这栋楼到另一栋…

android handler封装_Handler都没搞懂,你拿什么去跳槽啊?!

0. 前言做 Android 开发肯定离不开跟 Handler 打交道&#xff0c;它通常被我们用来做主线程与子线程之间的通信工具&#xff0c;而 Handler 作为 Android 中消息机制的重要一员也确实给我们的开发带来了极大的便利。Handler应用之广泛&#xff0c;可以说只要有异步线程与主线程…

做梦也想有一个这样的实验室

从现在开始&#xff0c;努力攒钱&#xff0c;等有钱了&#xff0c;自己也开一个这样的实验室。推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff…

努力过头了,其实并不好

昨天下午下班的时候&#xff0c;有一个读者朋友找我聊天。我再说下聊天这个事情&#xff0c;如果大家有事情&#xff0c;可以在群里艾特我&#xff0c;因为重要的群我会置顶&#xff0c;置顶的群我会看消息&#xff0c;你在群里艾特我我一定能看到。当然&#xff0c;在群里发一…

jstack 脚本 自动日志_GitLab从安装到全自动化备份一条龙

原文地址[1]欢迎star需求1.在新服务器上安装并搭建好gitlab2.手动自动将旧服务器上的gitlab备份3.手动自动将gitlab备份包scp到新服务器上4.手动自动恢复新服务器上的gitlab备份包5.在新旧服务器上自动删除过期备份包前提1.版本•gitlab-ce是社区版•gitlab-ee是企业版1.方案•…

纪念音视频界前辈-雷霄骅

这是一篇记录文&#xff0c;纪念一位在音视频领域研究的博士雷霄骅。雷霄骅生前是中国传媒大学通信与信息系统博士在读生&#xff0c;于2016年7月17日凌晨猝死在学校主楼五层&#xff0c;10月就将迎来自己26岁的生日。雷霄骅在音视频领域有很深的造诣和贡献&#xff0c;指导了很…

gcc和g++有什么区别?

来源 | C语言中文网发展至今&#xff0c;GCC 编译器已经更新至 V10 版本&#xff0c;其功能也由最初仅能编译 C 语言&#xff0c;扩增至可以编译多种编程语言&#xff0c;其中就包括 C 。除此之外&#xff0c;当下的 GCC 编译器还支持编译 Go、Objective-C&#xff0c;Objectiv…

druid删除数据_Apache druid 删除数据流程 0.13

背景由于前端时间数据导入出现问题&#xff0c;导致druid 中的数据需要重新导入&#xff0c;但又要防止数据重复,需要把数据彻底清理。问题由于druid 属于时间序列数据库&#xff0c;删除的时候只能时间范围删除。删除流程根据时间范围查询segements 标识(在coordinator节点查询…

使用C语言扩展Python(四)

上一篇里的LAME项目已经展示了python如何与C语言交互&#xff0c;但程序仍不够理想&#xff0c;在python这一端仅仅是传递源文件和目标文件的路径&#xff0c;再调用C模块的encode方法来进行编码&#xff0c;但问题在于你无法控制encode函数&#xff0c;比如你想编码的源文件如…

案例 github_2019年12月Github上最热门的Java开源项目,速来围观!

转眼之间&#xff0c;已经进入了2020年&#xff0c;2019年发生的一切仿佛就在昨天。那么&#xff0c;刚过去不久的12月份GitHub上最热门的Java开源项目排行已经出炉啦。下面我带大家一起来看看上榜详情&#xff1a;1、Alinkhttps://github.com/alibaba/Alink Star 1695Alink 是…

实战CRC校验 | 固件如何校验自身完整性?

来源&#xff1a;公众号【鱼鹰谈单片机】作者&#xff1a;鱼鹰Osprey在一些比较严格的行业里面&#xff0c;不是说你的程序能完成必要功能就可以&#xff0c;还需要添加一些额外的功能&#xff0c;比如最常见的看门狗功能&#xff0c;它可以在程序死机时完成重启&#xff0c;但…

想一个颠覆性技术方向建议,你能想到什么?

如上图&#xff0c;是这次文章的主题。我对这个问题是有想法的&#xff0c;我现在是做音频研究&#xff0c;但是我觉得未来核心的方向一定是能源。试想一下&#xff0c;现在的手机功能越来越多&#xff0c;移动设备将会占领我们未来很长一段时间&#xff0c;那么手机的电池要如…

centos 安装idea 非可视化_太厉害了!目前 Redis 可视化工具最全的横向评测

转自&#xff1a;一入码坑深似海链接&#xff1a;www.jianshu.com/p/cb9f4dcb3b921. 命令行不知道大家在日常操作redis时用什么可视化工具呢&#xff1f;以前总觉得没有什么太好的可视化工具&#xff0c;于是问了一个业内朋友。对方回&#xff1a;你还用可视化工具&#xff1f;…

解决克隆clone github 仓库速度过慢的问题

解决克隆clone GitHub 仓库速度过慢的问题 由于大家都懂的原因&#xff0c;我们访问GitHub的速度确实有点慢&#xff0c;特别是克隆比较大的仓库的时候&#xff0c;那速度简直无法直视。 今天我就给大家带来一个邪门歪道&#xff0c;不通过FQ来解决速度问题。 先说结论吧&#…

聊聊身边的嵌入式,自拍神器自拍杆

曾几何时&#xff0c;自拍杆风靡世界&#xff0c;火当然是有原因的&#xff0c;这么一个小装备&#xff0c;极大的满足了人们爱拍照的需求&#xff0c;方便好用、经济实惠。恰巧我手上也有一个&#xff0c;收起来时很小、不占地方打开后可随意调节拍照同时它有个隐藏式三脚架功…

大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(十二)多语言支持...

虽然平时很少接触老外的项目、也很少碰到老外&#xff0c;但往往赚大钱的人是经常跟老外做买卖的人居多&#xff0c;他们大多需要网站是全英文的&#xff0c;我们往往上手有一个成熟的中文的网站或者软件&#xff0c;例如成熟的B2C网上购物系统&#xff0c;但是没办法也没精力再…

lisp用entmake生产圆柱体_德BBG公司开发用于CFRP储罐模块生产过程的自闭合HPRTM模具...

自主概念、足以批量生产、可以降低投资成本。每次操作最多可同时生产15个气瓶。照片来源&#xff1a;BBG机械制造商BBG GmbH&Co.KG(德国明德尔海姆)于9月16日提出了一种自动闭合高压树脂传递模塑(HP-RTM)模具的概念&#xff0c;该模具能够快速、重复地制造各种车辆用的紧凑…

【深度剖析】小米CyberDog四足机器人的AI运动系统的实现

2021年8月10日&#xff0c;雷军进行继宣布造车之后的第二次演讲。在这场以“我的梦想&#xff0c;我的选择”为主题的演讲上&#xff0c;雷军详细讲述了创业后的故事&#xff0c;发布了一系列全新产品。其中&#xff0c;给人最大惊喜同时也给人带来诸多疑问的就是我们这篇推文的…

变更控制管理流程图_制度是最好的老板,流程就是最好的管理!流程建立法则(附案例)...

为什么很多企业制定了战略&#xff0c;一线执行却没有到位&#xff1f;为什么员工办事拖拉&#xff0c;执行力不到位&#xff1f;为什么总有下属在等待老板分配任务&#xff0c;不能主动地去工作&#xff1f;为什么一些企业的老板处于很忙碌的的糟糕状态&#xff1f;上述这样问…

第二节:Css重写样式

一丶 进入浏览器---->F12----->找到要修改的区域的Style 进行重写Css样式 二丶打开新页面 window.open("/Persitent/OtherIndex?connectionId" connectionId,"_blank"); 转载于:https://www.cnblogs.com/chenze-Index/p/9309775.html