热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Golang入门学习(二):控制分支

文章目录[TOC]1.控制分支1.1if-else分支1.2switch分支1.4while和dowhile循环结构1.5多种循环结构1.6break1.7continue1

在这里插入图片描述



文章目录

    • @[TOC]
  • 1. 控制分支
    • 1.1 if-else分支
    • 1.2 switch分支
    • 1.4 while 和do...while循环结构
    • 1.5 多种循环结构
    • 1.6 break
    • 1.7 continue
    • 1.8 goto语句
    • 1.9 return语句


1. 控制分支

1.1 if-else分支

基本语法:

if condition1 {代码块1}else if condition2 {代码块2}............else{代码块3}

  • if之后的条件不需要添加小括号(官方不需要使用)
  • 分支执行体必须使用{}括起来,否则语法错误
  • 只能执行一个代码块,else部分不是必须的
  • if/elseif 中的condition必须是条件表达式,不能为赋值语句

/*
* if-else控制语句:
*请输入一个年龄,如果年龄大于18岁,可以进入风月场合;否则不让进入*/
func main() {var age intfmt.Println("请输入年龄:")fmt.Scanln(&age)if age < 18 {fmt.Println("少儿不宜&#xff0c;滚犊子&#xff01;&#xff01;&#xff01;")} else {fmt.Println("大爷&#xff0c;您里面请")}}

  • fmt.Scanln用法参见&#xff1a;https://golang.org/pkg/fmt/

if-else的执行体必须使用{}括起来

func main() {var x int &#61; 4if x > 2 {fmt.Printf("%d > 2\n", x)} else {fmt.Printf("%d <2\n", x)}}

1.2 switch分支

基本介绍&#xff1a;

  • 根据匹配不同条件执行不同的动作
  • GO中case分支之后不再需要添加break
  • [ ]

基本语法&#xff1a;

switch 表达式{case 表达式1,表达式2,...:执行的语句块1case 表达式3,表达式4,...:执行的语句块2...default:执行的语句块n}

快速入门示例&#xff1a;

func main() {var key bytefmt.Println("请输入任意一个字符&#xff1a;A,B,C,D,E,F,G")fmt.Scanf("%c", &key)switch key {case &#39;A&#39;, &#39;a&#39;:fmt.Println("Monday!!!")case &#39;B&#39;, &#39;b&#39;:fmt.Println("Tuesday!!!")case &#39;C&#39;, &#39;c&#39;:fmt.Println("Wednesday!!!")case &#39;D&#39;, &#39;d&#39;:fmt.Println("Thursday!!!")case &#39;E&#39;, &#39;e&#39;:fmt.Println("Friday!!!")case &#39;F&#39;, &#39;f&#39;:fmt.Println("Saturday!!!")case &#39;G&#39;, &#39;g&#39;:fmt.Println("Sunday!!!")default:fmt.Println("Error!!!")}
}

switch 细节讨论&#xff1a;

  • case 之后是一个(多个)表达式&#xff08;常量、变量、有返回值的函数&#xff09;&#xff0c;witch同样如此
  • 每一个case分支不需要break来结束
  • case后的表达式的值的数据类型必须和switch表达式数据类型保持一致
  • case之后的表达式如果为常量&#xff0c;则不能重复&#xff1a;
  • default语句不是必须的

    func demo1() {var a int &#61; 10switch a {case 1, 2, 3:fmt.Println("1111111111111")case 4, 5, 6:fmt.Println("22222222222222")case 7, 7:/*常量重复&#xff0c;无法编译通过*/fmt.Println("3333333333333")}
    }

  • switch之后可以不填写表达式&#xff0c;在case时再填写

    func demo3() {var a int &#61; 10switch {case a &#61;&#61; 10:fmt.Println("1111111111111")case a &#61;&#61; 20:fmt.Println("22222222222222")default:fmt.Println("3333333333333")}
    }

  • case之后可以使用范围匹配

    func demo4() {var score int &#61; 91switch {case score &#61;&#61; 100:fmt.Println("优秀")case score >&#61; 80 && score < 100:fmt.Println("优秀")case score >&#61; 60 && score < 80:fmt.Println("良")default:fmt.Println("差")}
    }

  • switch中允许直接声明一个变量&#xff0c;然后以分号结束

    func demo5() {switch age :&#61; 15; {case age < 18:fmt.Println(age, "未成年人&#xff0c;小屁孩!!!!")default:fmt.Println("Who care your age!")}
    }

  • switch穿透&#xff1a;在case语句块中后添加fallthrough,则会继续执行检测判断后面的case语句

    func demo6() {var score int &#61; 91switch {case score &#61;&#61; 100:fmt.Println("优秀")fallthrough //默认只能穿透一层case score >&#61; 80 && score < 100:fmt.Println("优秀")fallthroughcase score >&#61; 60 && score < 80:fmt.Println("良")fallthroughdefault:fmt.Println("差")}
    }

  • 使用type-switch判断一个空接口指向的变量类型

    func demo7() {var x interface{}x &#61; demo6switch i :&#61; x.(type) {case nil:fmt.Printf("x的类型为&#xff1a;%T\n", i)case int, int8, int16, int32, int64:fmt.Printf("x的类型为&#xff1a;%T\n", i)case float32, float64:fmt.Printf("x的类型为&#xff1a;%T\n", i)case func(int) float64:fmt.Printf("x的类型为&#xff1a;%T\n", i)case bool, string:fmt.Printf("x的类型为&#xff1a;%T\n", i)default:fmt.Printf("x的类型为&#xff1a;%T\n", i)}
    }

0

  • 语法格式&#xff1a;

for 循环变量初始化&#xff1b;循环条件&#xff1b;循环变量迭代{循环体}for 循环条件{循环执行体}for {/*死循环*/循环执行体}

  • 快速入门示例&#xff1a;

func main() {var i intfor i &#61; 2000; i < 2021; i&#43;&#43; {fmt.Printf("%d年过去了\n", i)}i &#61; 2000for i < 2021 {fmt.Printf("%d年过去了\n", i)i&#43;&#43;}for {fmt.Printf("%d年过去了\n", i)i&#43;&#43;if i > 2020 {break}}
}

  • 字符串遍历方式&#xff1a;
    • for循环遍历

      func demo1() {var str string &#61; "Hello World!"for i :&#61; 0; i < len(str); i&#43;&#43; {fmt.Printf("str[%d] &#61; %c\n", i, str[i])}}

    • for &#43; range遍历

      func demo2() {var str string &#61; "Hello World!"for index, val :&#61; range str {fmt.Printf("str[%d] &#61; %q\n", index, val)}
      }

  • for细节讨论
    上述遍历过程中&#xff0c;如果包含中文&#xff0c;则遍历会出现乱码的问题。原因是&#xff1a;传统遍历采用utf-8编码(字节遍历)&#xff0c;而汉字在utf8中对应3个字节。
    解决方案&#xff1a;

将字符串转换为切片的方式&#xff0c;然后再进行遍历。
对于上面的两种字符串遍历方式&#xff0c;第一种for循环逐字节遍历由于编码问题导致中文乱码&#xff1b;而第二种for-range方式则不会出现此问题&#xff1a;

/*字符串中包含中文字符*/
func demo3() {var str string &#61; "Hello World!数风流人物&#xff0c;还看今朝"for i :&#61; 0; i < len(str); i&#43;&#43; {fmt.Printf("str[%d] &#61; %c\n", i, str[i])/*乱码*/}fmt.Println("")for index, val :&#61; range str {fmt.Printf("str[%d] &#61; %q\n", index, val)/*正常*/}
}

使用for循环结构时&#xff0c;将字符串转换为rune切片类型时&#xff0c;可以正确显示字符串信息&#xff1a;

var str string &#61; "Hello World!数风流人物&#xff0c;还看今朝"str2 :&#61; []rune(str)for i :&#61; 0; i < len(str2); i&#43;&#43; {fmt.Printf("str[%d] &#61; %c\n", i, str2[i])}

1.4 while 和do…while循环结构

在Go语言中&#xff0c;没有while和do…while结构&#xff0c; 但是可以使用for循环结构来实现对应的功能。

  • 使用for实现while&#xff1a;

for{循环条件判断语句循环语句执行体}

  • 使用for实现do…while&#xff1a;

for{循环语句执行体循环条件判断语句}

1.5 多种循环结构


  • 打印九九乘法表

func demo1() {var a &#61; 9for i :&#61; 1; i <&#61; a; i&#43;&#43; {for j :&#61; 1; j <&#61; i; j&#43;&#43; {fmt.Printf("%v x %v &#61; %v\t", j, i, i*j)}fmt.Println("")}}

运行结果如下&#xff1a;

1 x 1 &#61; 1
1 x 2 &#61; 2 2 x 2 &#61; 4
1 x 3 &#61; 3 2 x 3 &#61; 6 3 x 3 &#61; 9
1 x 4 &#61; 4 2 x 4 &#61; 8 3 x 4 &#61; 12 4 x 4 &#61; 16
1 x 5 &#61; 5 2 x 5 &#61; 10 3 x 5 &#61; 15 4 x 5 &#61; 20 5 x 5 &#61; 25
1 x 6 &#61; 6 2 x 6 &#61; 12 3 x 6 &#61; 18 4 x 6 &#61; 24 5 x 6 &#61; 30 6 x 6 &#61; 36
1 x 7 &#61; 7 2 x 7 &#61; 14 3 x 7 &#61; 21 4 x 7 &#61; 28 5 x 7 &#61; 35 6 x 7 &#61; 42 7 x 7 &#61; 49
1 x 8 &#61; 8 2 x 8 &#61; 16 3 x 8 &#61; 24 4 x 8 &#61; 32 5 x 8 &#61; 40 6 x 8 &#61; 48 7 x 8 &#61; 56 8 x 8 &#61; 64
1 x 9 &#61; 9 2 x 9 &#61; 18 3 x 9 &#61; 27 4 x 9 &#61; 36 5 x 9 &#61; 45 6 x 9 &#61; 54 7 x 9 &#61; 63 8 x 9 &#61; 72 9 x 9 &#61; 81

1.6 break


  • 生成随机数的package为:rand。 https://golang.org/pkg/math/rand/

    • rand.Intn(): 生成[0, n&#xff09;范围的随机数。相同的种子生成相同的伪随机数&#xff0c;种子不同生成的随机数也不同&#xff0c;因此通常使用时间作为随机种子

    官网示例程序如下:package mainimport ("fmt""math/rand")func main() {// Seeding with the same value results in the same random sequence each run.// For different numbers, seed with a different value, such as// time.Now().UnixNano(), which yields a constantly-changing number.rand.Seed(86)fmt.Println(rand.Intn(100))fmt.Println(rand.Intn(100))fmt.Println(rand.Intn(100))}

  • 生成时间的package为&#xff1a;time。 https://golang.org/pkg/time/

    • 通常使用时间作为生成随机数的种子,如time.Unix, time.UnixNano,他们分别返回自1970.1.1年以来的秒数和纳秒数
  • break入门示例&#xff1a;

func main() {for {rand.Seed(time.Now().UnixNano())randNum :&#61; rand.Intn(100) &#43; 1fmt.Println(randNum)if randNum &#61;&#61; 99 {break}}
}

  • break注意事项
    • break默认跳出最近的循环结构
    • break可以通过标签来指定循环结构

      func demo2() {
      Lable1:for i :&#61; 0; i < 6; i&#43;&#43; {Lable2:for j :&#61; 0; j < 10; j&#43;&#43; {fmt.Println(i, j)if j &#61;&#61; 6 {break Lable1 /*break默认退出的是最近的循环*/} else if j &#61;&#61; 20 {break Lable2}}}
      }


1.7 continue


  • 用于结束本次循环&#xff0c;继续执行下一次循环
  • 与break一样&#xff0c;支持通过标签跳转到指定循环中

1.8 goto语句


  • Go语言中支持goto操作&#xff0c;同其他语言一样不推荐使用。goto的基本语法&#xff1a;

goto lable... ...lable:xxx.xxx

goto入门示例&#xff1a;

func main() {fmt.Println("钟山风雨起苍黄")fmt.Println("百万雄师过大江")goto XXXfmt.Println("虎踞龙盘今胜昔")fmt.Println("天翻地覆慨而慷")fmt.Println("宜将剩勇追穷寇")fmt.Println("不可沽名学霸王")XXX:fmt.Println("天若有情天亦老")fmt.Println("人间正道是沧桑")
}

执行结果如下&#xff1a;

钟山风雨起苍黄
百万雄师过大江
天若有情天亦老
人间正道是沧桑

1.9 return语句


  • 退出函数
  • 如果在main函数中则是退出程序

推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
mobiledu2502927147
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有