一文带你熟悉Go语言中的分支结构

目录
  • 分支结构
  • if
    • 单分支 if
    • 双分支 if-else
    • 多分支 if - else if - else
    • 在 if 语句中声明变量
  • switch
    • 示例
    • switch 分支当 if 分支使用
    • 在 switch 语句中声明变量
    • fallthrough
  • 小结

分支结构

分支结构是结构化程序设计中的基础。针对分支结构,Go 提供了两种语句形式,一种是 if,另一种是 switch

if

if 语句是 Go 中最常用、最简单的分支控制结构,它分为单分支、双分支以及多分支三种用法。if 语句会根据布尔变量或布尔表达式,在两个或多个分支中选择一个执行。以下为 if 语句的形式:

if bool_condition {
	// 新分支
}
// 原分支

如果布尔变量或布尔表达式为 true ,则进入新分支执行,否则会继续按照原分支的代码去执行。

单分支 if

单分支的用法,如果布尔表达式成立,则执行新分支的代码,然后继续执行原分支的代码,否则执行原分支的代码,下面是代码示例:

import "fmt"

func main() {
	num := 3
	if num > 2 {
		fmt.Println("num 大于 2")
	}
	fmt.Println("原分支代码")
}

打印结果

num 大于 2
原分支代码

因为 num > 2 因此,程序运行之后,会执行新分支的打印语句以及原分支的打印语句。除了单个布尔表达式以外,还可以加入 &&|| 条件运算符进行条件的组合,例如:

import "fmt"

func main() {
	num := 3
	if num > 2 && num < 10 {
		fmt.Println("num 大于 2 并且 num 小于 10")
	}
	fmt.Println("原分支代码")
}

双分支 if-else

双分支结构,if 配合 else 关键字实现。如果表达式为 true,执行 分支1,否则执行 分支2,然后继续执行 原分支。下面是代码示例:

import "fmt"

func main() {
	age := 18
	if age == 18 {
		fmt.Println("您已满18岁")
	} else {
		fmt.Println("您未满18岁")
	}
	fmt.Println("原分支代码")
}

执行结果:

您已满18岁
原分支代码

age 的值为 18,因此会执行第一个分支的里打印语句,然后继续执行原分支的打印语句。

多分支 if - else if - else

多分支需要在 ifelse 的形式上,加上 else if 进行实现。如果 if 后面的布尔表达式不成立,则会判断 else if 后面的布尔表达式,然后进行分支的选择,下面是代码示例:

import "fmt"

func main() {
	name := "小明"
	if name == "小红" {
		fmt.Println("您好,小红!")
	} else if name == "小明" {
		fmt.Println("您好,小明!")
	} else {
		fmt.Println("您好,陌生人!")
	}
	fmt.Println("原分支代码")
}

执行结果:

您好,小明!
原分支代码

程序根据布尔表达式条件的值,选择了第二个分支去执行代码。

在 if 语句中声明变量

if 语句中,布尔表达式之前声明变量是 Go 语言的惯用法,这种使用方式可以提高代码的可读性。由于是在 if 语句中声明的变量,因此变量的作用域也只在 if 语句中,外部无法访问这些变量。下面是示例:

import "fmt"

func main() {
	mp := map[string]string{"name": "cmy"}

	if name, ok := mp["name"]; ok {
		fmt.Printf("存在 key → name:%s\n", name)
	} else {
		fmt.Println("key 不存在")
	}
	fmt.Println("原分支代码")
}

if 语句中定义 name,ok 变量,使用 ok 判断 key 是否存在,如果存在则执行分支里的代码。

switch

基本用法:

switch T {
case value1:
	// 分支 1
case value2, value3, ...:
	// 分支 2
...
default:
	// 默认分支
}

T 可以是常量、变量和布尔表达式等,case 关键字后面的 value 类型,必须与 T 的类型是一致的,且 value 是唯一的。Go 会根据 T 的值与各个 case 后面的 value 进行匹配,匹配成功则执行对应 case 分支,case 后面可以有多个 value。default 为默认分支,可有可无,如果前面的 case 都没匹配上,则会执行 default 分支。

示例

import "fmt"

func main() {
	name := "小明"
	if name == "小红" {
		fmt.Println("您好,小红!")
	} else if name == "小明" {
		fmt.Println("您好,小明!")
	} else {
		fmt.Println("您好,陌生人!")
	}
	fmt.Println("原分支代码")
}

上面的代码,可以使用 switch 分支改造:

import "fmt"

func main() {
	name := "小明"
	switch name {
	case "小明":
		fmt.Println("您好,小明!")
	case "小红":
		fmt.Println("您好,小红!")
	default:
		fmt.Println("您好,陌生人!")

	}
	fmt.Println("原分支代码")
}

执行结果:

您好,小明!
原分支代码

name 等于 小明,与第一个 case 分支匹配成功,执行这个分支的代码,然后继续执行原分支的代码。

switch 分支当 if 分支使用

switch 分支后面不带常量、变量或布尔表达式等时,其效果与 if 分支类似。

import "fmt"

func main() {
	switch {
	case 1+1 != 2:
		fmt.Println("1 + 1 不等于 2")
	case 1+1 == 2:
		fmt.Println("1 + 1 等于 2")
	default:
		fmt.Println("0")

	}
	fmt.Println("原分支代码")
}

switch 后面什么都没有时,程序会根据 case 后面布尔表达式的值进行分支的选择。

在 switch 语句中声明变量

if 一样,我们也可以在 switch 语句中声明变量,变量的作用域也只在 swtich 语句中,外部无法访问这些变量。

import "fmt"

func main() {
	mp := map[string]string{"name": "cmy"}
	switch name := mp["name"]; name {
	case "cmy":
		fmt.Println("cmy")
	case "kk":
		fmt.Println("kk")
	default:
		fmt.Println("unknown")

	}
	fmt.Println("原分支代码")
}

fallthrough

Go 语言中,不同于其他语言,switch 块内,每个 case 无需声明 break 来终止。如果我们想执行多个 case 分支,可以使用 fallthrough 关键字来实现。

import "fmt"

func main() {
	mp := map[string]string{"name": "cmy"}
	switch name := mp["name"]; name {
	case "cmy":
		fmt.Println("cmy")
		fallthrough
	case "kk":
		fmt.Println("kk")
	default:
		fmt.Println("unknown")

	}
	fmt.Println("原分支代码")
}

执行结果:

cmy
kk
原分支代码

在第一个 case 分支后面使用了 fallthrough,不论下一个 case 是否与 cmy 匹配,都会执行这个分支的代码。

小结

本文对两种分支结构(ifswitch)进行了介绍,也举例说明了一些特殊的用法。如果代码存在着复杂的 if 多分支结构,不妨用 swtich 进行改造,也许代码的可读性会更高。

到此这篇关于一文带你熟悉Go语言中的分支结构的文章就介绍到这了,更多相关Go语言分支结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Go中的条件语句Switch示例详解

    Switch简介 Go的switch的基本功能和C.Java类似: switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止. 匹配项后面也不需要再加 break. 特点: switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case 重点介绍Go当中的Switch的两个特别点:** 表达式判断为true还需要执行后面的 case,可以使用 fallthrough type-switch 来判断某个 i

  • Go语言学习之Switch语句的使用

    目录 基本语法 fallthrough使用方法 多条件匹配 判断接口(interface)类型 空接口 获取实际类型 基本语法 在讲述if-else时已经提到,如果有多个判断条件,Go语言中提供了Switch-Case的方式.如果switch后面不带条件相当于switch true // Convert hexadecimal character to an int value switch { case '0' <= c && c <= '9': return c - '0'

  • Go语言中的switch用法实例分析

    本文实例讲述了Go语言中的switch用法.分享给大家供大家参考.具体分析如下: 这里你可能已经猜到 switch 可能的形式了. case 体会自动终止,除非用 fallthrough 语句作为结尾. 复制代码 代码如下: package main import (  "fmt"  "runtime" ) func main() {  fmt.Print("Go runs on ")  switch os := runtime.GOOS; os

  • go语言if/else语句简单用法示例

    本文实例讲述了go语言if/else语句用法.分享给大家供大家参考,具体如下: if else分支在go语言里是简单明了的. 这里有个简单的例子. if语句可以没有else. 可以在条件语句前添加别的语句.这个语句中声明的变量的作用域在所有的分支中. 注意:在go语言中条件语句没必要带圆括号.但是分支中必须有大括号. 在go语言里面没有三元条件语句,所以即使是简单的条件语句你也必须使用全机构的if语句(就是说go里没有个?:表达式 ). 示例代码: 复制代码 代码如下: package main

  • Go语言每天必学之switch语句

    Go 语言 switch 语句 switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上直下逐一测试,直到匹配为止.. switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break 语法 Go 编程语言中 switch 语句的语法如下: switch var1 { case val1: ... case val2: ... default: ... } 变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值.类型

  • 一文带你熟悉Go语言中的分支结构

    目录 分支结构 if 单分支 if 双分支 if-else 多分支 if - else if - else 在 if 语句中声明变量 switch 示例 switch 分支当 if 分支使用 在 switch 语句中声明变量 fallthrough 小结 分支结构 分支结构是结构化程序设计中的基础.针对分支结构,Go 提供了两种语句形式,一种是 if,另一种是 switch. if if 语句是 Go 中最常用.最简单的分支控制结构,它分为单分支.双分支以及多分支三种用法.if 语句会根据布尔变

  • 一文带你熟悉Go语言中函数的使用

    目录 函数 函数的声明 Go 函数支持变长参数 匿名函数 闭包 init 函数 函数参数详解 形式参数与实际参数 值传递 函数是一种数据类型 小结 函数 函数的英文单词是 Function,这个单词还有着功能的意思.在 Go 语言中,函数是实现某一特定功能的代码块.函数代表着某个功能,可以在同一个地方多次使用,也可以在不同地方使用.因此使用函数,可以提高代码的复用性,减少代码的冗余. 函数的声明 通过案例了解函数的声明有哪几部分: 定义一个函数,实现两个数相加的功能,并将相加之后的结果返回. f

  • 一文带你了解Go语言中方法的调用

    目录 前言 方法 方法的调用 Receiver 参数类型的选择 方法的约束 小结 前言 在前面的 一文熟悉 Go 函数 文章中,介绍了 Go 函数的声明,函数的几种形式如匿名函数.闭包.基于函数的自定义类型和函数参数详解等,而本文将对方法进行介绍,方法的本质就是函数,介绍方法的同时也会顺带对比其与函数的不同之处. 方法 在 Go 中,我们可以为任何的数据类型定义方法(指针或接口除外),现在让我们看一看方法的声明和组成部分以及与函数有什么不同之处. type Person struct { age

  • 一文带你了解Go语言中的单元测试

    目录 基本概念 示例一:取整函数基本测试 示例二:Fail()函数 示例三:FailNow函数 实例四:Log和Fetal函数 基本概念 上一节提到,代码完成的标准之一还包含了单元测试,这部分也是很多开发流程中不规范的地方.写过单元测试的开发人员应该理解,单元测试最核心的价值是为了证明:为什么我写的代码是正确的?也就是从逻辑角度帮你检查你的代码.但是另外一方面,如果从单元测试覆盖率角度来看,单元测试也是非常耗时的,几乎是三倍于你代码的开发时间,所以在很多迭代速度非常快的项目中,单元测试就几乎没人

  • 一文带你入门Go语言中定时任务库Cron的使用

    目录 前言 快速开始 安装 导入 Demo Cron表达式格式 标准格式 预定义时间表 常用的方法介绍 new() AddJob() AddFunc() Start() 相关推荐 Go第三方库之cronexpr——解析 crontab 表达式 总结 前言 在平时的开发需求中,我们经常会有一些重复执行的操作需要触发执行,和系统约个时间,在几点几分几秒或者每隔几分钟跑一个任务,说白了就是定时任务,,想必大家第一反应都是linux的Crontab.其实定时任务不止使用系统自带的Crontab,在Go语

  • 一文带你了解Go语言中的类型断言和类型转换

    目录 类型断言 类型判断 为什么需要断言 类型转换 什么时候使用类型转换 类型为什么称为转换 类型结论 在Go中,类型断言和类型转换是一个令人困惑的事情,他们似乎都在做同样的事情. 下面是一个类型断言的例子: var greeting interface{} = "hello world" greetingStr := greeting.(string) 接着看一个类型转换的例子: greeting := []byte("hello world") greeting

  • 一文带你了解Go语言中的指针和结构体

    目录 前言 指针 指针的定义 获取和修改指针所指向变量的值 结构体 结构体定义 结构体的创建方式 小结 前言 前面的两篇文章对 Go 语言的基础语法和基本数据类型以及几个复合数据类型进行介绍,本文将对 Go 里面的指针和结构体进行介绍,也为后续文章做铺垫. 指针 在 Go 语言中,指针可以简单理解是一个地址,指针类型是依托于某一个类型而存在的,例如 Go 里面的基本数据类型 int.float64.string 等,它们所对应的指针类型为 *int.*float64.*string等. 指针的定

  • 一文带你了解Go语言中接口的使用

    目录 接口 接口的实现 接口类型变量 空接口 类型断言 类型断言变种 type switch 小结 接口 在 Go 语言中,接口是一种抽象的类型,是一组方法的集合.接口存在的目的是定义规范,而规范的细节由其他对象去实现.我们来看一个例子: import "fmt" type Person struct { Name string } func main() { person := Person{Name: "cmy"} fmt.Println(person) //

  • 一文带你掌握Go语言中的文件读取操作

    目录 os 包 和 bufio 包 os.Open 与 os.OpenFile 以及 File.Read 读取文件操作 bufio.NewReader 和 Reader.ReadString 读取文件操作 小结 os 包 和 bufio 包 Go 标准库的 os 包,为我们提供很多操作文件的函数,如 Open(name) 打开文件.Create(name) 创建文件等函数,与之对应的是 bufio 包,os 包是直接对磁盘进行操作的,而 bufio 包则是带有缓冲的操作,不用每次都去操作磁盘.

  • 一文带你了解C语言中的动态内存管理函数

    目录 1.什么是动态内存管理 2.为什么要有动态内存管理 3.如何进行动态内存管理 3.1 malloc 3.2 free 3.3 calloc 3.4 realloc 总结 1.什么是动态内存管理 平时我们写代码,一种非常常见的写法是: int a = 0; // 创建一个变量 int arr[10] = {0}; // 创建一个数组 当你创建变量a的时候,其实是向内存中申请了4个字节的空间来存放一个整数.而当你创建数组arr的时候,是向内存中申请了40个字节的空间来存放10个整数.当你这么写

随机推荐