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 int fmt.Println("请输入年龄:")
fmt.Scanln(&age) if age < 18 {
fmt.Println("少儿不宜,滚犊子!!!")
} else {
fmt.Println("大爷,您里面请")
} }
  • fmt.Scanln用法参见:https://golang.org/pkg/fmt/

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

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

1.2 switch分支

基本介绍:

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

基本语法:

	switch 表达式{

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

快速入门示例:

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

switch 细节讨论:

  • case 之后是一个(多个)表达式(常量、变量、有返回值的函数),witch同样如此
  • 每一个case分支不需要break来结束
  • case后的表达式的值的数据类型必须和switch表达式数据类型保持一致
  • case之后的表达式如果为常量,则不能重复:
  • default语句不是必须的
    func demo1() {
    var a int = 10 switch a {
    case 1, 2, 3:
    fmt.Println("1111111111111")
    case 4, 5, 6:
    fmt.Println("22222222222222")
    case 7, 7:/*常量重复,无法编译通过*/
    fmt.Println("3333333333333")
    }
    }
  • switch之后可以不填写表达式,在case时再填写
    	func demo3() {
    var a int = 10 switch {
    case a == 10:
    fmt.Println("1111111111111")
    case a == 20:
    fmt.Println("22222222222222")
    default:
    fmt.Println("3333333333333")
    }
    }
  • case之后可以使用范围匹配
    func demo4() {
    var score int = 91 switch {
    case score == 100:
    fmt.Println("优秀")
    case score >= 80 && score < 100:
    fmt.Println("优秀")
    case score >= 60 && score < 80:
    fmt.Println("良")
    default:
    fmt.Println("差")
    }
    }
  • switch中允许直接声明一个变量,然后以分号结束
    func demo5() {
    switch age := 15; {
    case age < 18:
    fmt.Println(age, "未成年人,小屁孩!!!!")
    default:
    fmt.Println("Who care your age!")
    }
    }
  • switch穿透:在case语句块中后添加fallthrough,则会继续执行检测判断后面的case语句
    func demo6() {
    var score int = 91 switch {
    case score == 100:
    fmt.Println("优秀")
    fallthrough //默认只能穿透一层
    case score >= 80 && score < 100:
    fmt.Println("优秀")
    fallthrough
    case score >= 60 && score < 80:
    fmt.Println("良")
    fallthrough
    default:
    fmt.Println("差")
    }
    }
  • 使用type-switch判断一个空接口指向的变量类型
    func demo7() {
    var x interface{}
    x = demo6 switch i := x.(type) {
    case nil:
    fmt.Printf("x的类型为:%T\n", i)
    case int, int8, int16, int32, int64:
    fmt.Printf("x的类型为:%T\n", i)
    case float32, float64:
    fmt.Printf("x的类型为:%T\n", i)
    case func(int) float64:
    fmt.Printf("x的类型为:%T\n", i)
    case bool, string:
    fmt.Printf("x的类型为:%T\n", i)
    default:
    fmt.Printf("x的类型为:%T\n", i)
    }
    }

0

  • 语法格式:
	for 循环变量初始化;循环条件;循环变量迭代{
循环体
} for 循环条件{
循环执行体
} for {/*死循环*/
循环执行体
}
  • 快速入门示例:
func main() {
var i int for i = 2000; i < 2021; i++ {
fmt.Printf("%d年过去了\n", i)
} i = 2000
for i < 2021 {
fmt.Printf("%d年过去了\n", i)
i++
} for {
fmt.Printf("%d年过去了\n", i)
i++
if i > 2020 {
break
}
}
}
  • 字符串遍历方式:

    • for循环遍历
      func demo1() {
      var str string = "Hello World!" for i := 0; i < len(str); i++ {
      fmt.Printf("str[%d] = %c\n", i, str[i])
      } }
    • for + range遍历
      func demo2() {
      var str string = "Hello World!" for index, val := range str {
      fmt.Printf("str[%d] = %q\n", index, val)
      }
      }
  • for细节讨论
    上述遍历过程中,如果包含中文,则遍历会出现乱码的问题。原因是:传统遍历采用utf-8编码(字节遍历),而汉字在utf8中对应3个字节。
    解决方案:

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

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

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

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

1.4 while 和do…while循环结构

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

  • 使用for实现while:
	for{
循环条件判断语句 循环语句执行体
}
  • 使用for实现do…while:
	for{
循环语句执行体 循环条件判断语句
}

1.5 多种循环结构

  • 打印九九乘法表
func demo1() {
var a = 9 for i := 1; i <= a; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%v x %v = %v\t", j, i, i*j)
}
fmt.Println("")
} }

运行结果如下:

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

1.6 break

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

    • rand.Intn(): 生成[0, n)范围的随机数。相同的种子生成相同的伪随机数,种子不同生成的随机数也不同,因此通常使用时间作为随机种子
      官网示例程序如下:
    package main import (
    "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为:time。 https://golang.org/pkg/time/

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

func main() {
for {
rand.Seed(time.Now().UnixNano())
randNum := rand.Intn(100) + 1 fmt.Println(randNum)
if randNum == 99 {
break
}
}
}
  • break注意事项

    • break默认跳出最近的循环结构
    • break可以通过标签来指定循环结构
      func demo2() {
      Lable1:
      for i := 0; i < 6; i++ {
      Lable2:
      for j := 0; j < 10; j++ {
      fmt.Println(i, j)
      if j == 6 {
      break Lable1 /*break默认退出的是最近的循环*/
      } else if j == 20 {
      break Lable2
      }
      }
      }
      }

1.7 continue

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

1.8 goto语句

  • Go语言中支持goto操作,同其他语言一样不推荐使用。goto的基本语法:
	goto lable

	... ...

	lable:
xxx.xxx

goto入门示例:

func main() {

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

执行结果如下:

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

1.9 return语句

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

Golang入门学习(二):控制分支的更多相关文章

  1. ReactJS入门学习二

    ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ...

  2. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

  3. git入门学习(二):新建分支/上传代码/删除分支

    一.git新建分支,上传代码到新的不同分支  我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ...

  4. Egg入门学习(二)---理解service作用

    在上一篇文章 Egg入门学习一 中,我们简单的了解了Egg是什么东西,且能做什么,这篇文章我们首先来看看官网对Egg的整个框架的约定如下,及约定对应的目录是做什么的,来有个简单的理解,注意:我也是按照 ...

  5. 04 Python入门学习-流程控制(if else elif while for)

    一:流程控制if 语法一: if 条件: code1 code2 code3 ... age = 20 height = 170 weight = 60 sex = 'female' is_beaut ...

  6. Golang入门学习(三):函数

    文章目录 2.3 函数 2.3.1 基本语法 2.3.2 入门demo: 2.3.3 函数递归: 2.3.4 函数注意事项 2.3.5 init函数 2.3.6 匿名函数 2.3.7 闭包 2.3.8 ...

  7. iOS中 Swift初级入门学习(二)

    // Copyright (c) 2015年 韩俊强. All rights reserved. // import Foundation /* // 控制语句 // for - in // 遍历字符 ...

  8. 04-Python入门学习-流程控制

    一.流程控制if 语法1: if 条件:  code1  code2  code3  .... age=180 height=163 weight=75 sex='female' is_beautif ...

  9. node入门学习(二)

    一.模块系统 1.创建模块和引用模块 //如何创建一个模块 exports.hello = function(){ console.log('hello worl'); }; //这创建了一个模块 / ...

随机推荐

  1. 一些Shell脚本记录

    查看换行符 使用vim打开文件,输入:set ff?.根据返回结果可以文件类型 字符串 opcenter.sjb.bz [root@opcenter backup]# echo ${HOSTNAME% ...

  2. netty系列之:Event、Handler和Pipeline

    目录 简介 ChannelPipeline ChannelHandler ChannelHandlerContext ChannelHandler中的状态变量 异步Handler 总结 简介 上一节我 ...

  3. Linux 数据库操作(一)

    我们可以将用于数据服务的数据库分为关系型数据库和非关系型数据库,关系型数据库最典型的就是Mysql,以及和他同源的MariaDB数据库,oracle等,非关系型数据库则有redis数据库,mongod ...

  4. 那些 22 岁毕业做Android开发的人,他们 50 岁左右时的人生轨迹是怎样的?

    本人今年35了,已经干了14年程序员,是14年不是13年,因为我是专科毕业. 一直就是普普通通的程序员,特别纯的码农,从没做过管理岗位,并且很可能以后也是如此. 现在已经上有老下有小. 曾经在某著名互 ...

  5. Git-07-分支管理

    创建与合并分支 为什么要创建分支? 假设你准备开发一个新功能,但是需要两周才能完成, 第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了. 如果等代码全部写完 ...

  6. 【原创】冰蝎v3.0操作使用手册

    写在前面 近期冰蝎更新了内网穿透模块中的一些功能,有不少朋友不知道参数怎么填,希望能出一个使用指导手册,就借这个机会写一个"说明书"(文中有大量演示动图,请耐心等待加载). 基本信 ...

  7. 寻找写代码感觉(二)之 Spring Boot 项目属性配置

    一.前言 写代码就和恋爱一样,有反馈就要趁热打铁,搞完了项目搭建,接下来就来搞搞项目配置. 二.IDEA设置 1.编码配置 这里所说的就是代码的编码格式,你可以不设置,但是可能要面临的是,很多未知的麻 ...

  8. NOIP 模拟 $24\; \rm graph$

    题解 \(by\;zj\varphi\) 首先一个点能否选择的条件是 \(dis_{1,x}+dis_{x,n}=dis_{1,n}\) 正解是计算一条道路上的所有为 \(-1\) 边的选择范围,是个 ...

  9. Linux系统管理命令-systemctl 和 sshd 服务

    一系统服务管理命令systemctl 开启一个服务 : systemctl start sshd 关闭一个服务: systemctl stop sshd 查看一个服务的状态: systemctl st ...

  10. asp.net core 搭建WebAPI微服务-----cosnul服务

    参考网址:https://blog.csdn.net/weixin_42084199/article/details/108643555 在此之前需要准备的是: vs2019,以往版本不支持dotne ...