首页 > 其他分享 >2.4 Go语言从入门到精通:条件和循环

2.4 Go语言从入门到精通:条件和循环

时间:2023-04-14 14:06:22浏览次数:42  
标签:语句 case 入门 示例 fmt 循环 Go main 2.4


在程序中必然少不了条件语句和循环语句,Go 语言在条件、循环语句方面与其他语言存在一定的差异,本文将针对Go 语言中条件语句、循环语句的使用,这将会奠定后续复杂程序的基础。

1、条件语句

条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句。

下图展示了程序语言中条件语句的结构:

2.4 Go语言从入门到精通:条件和循环_布尔表达式

Go 语言提供了以下几种条件判断语句:

语句

描述

if 语句

if 语句 由一个布尔表达式后紧跟一个或多个语句组成。

if...else 语句

if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。

if 嵌套语句

你可以在 ifelse if 语句中嵌入一个或多个 ifelse if 语句。

switch 语句

switch 语句用于基于不同条件执行不同动作。

select 语句

select 语句类似于 switch 语句,但是select 会随机执行一个可运行的case。如果没有case 可运行,它将阻塞,直到有case可运行。

注意:Go 没有三目运算符,所以不支持 ? : 形式的条件判断。

1.1 if 语句

语法

Go 编程语言中 if 语句的语法如下:

if 布尔表达式 {
   // 在布尔表达式为 true 时执行
}

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则不执行。

布尔表达式可以不用()括起来,简洁了很多。

流程图如下:

2.4 Go语言从入门到精通:条件和循环_布尔表达式_02

示例

使用 if 判断一个整数的大小,示例如下:

package main

import "fmt"

func main() {
	var a int = 10

	if a < 20 {
		fmt.Printf("a 小于 20\n")
	}
}

输出结果如下:

a 小于 20

1.2 if … else 语句

语法

Go 编程语言中 if...else 语句的语法如下:

if 布尔表达式 {
   // 在布尔表达式为 true 时执行
} else {
  // 在布尔表达式为 false 时执行
}

If 在布尔表达式为 true 时,其后紧跟的语句块执行,如果为 false 则执行 else 语句块。

流程图如下:

2.4 Go语言从入门到精通:条件和循环_循环语句_03

示例

使用if else 判断一个整数的大小,示例如下:

package main

import "fmt"

func main() {
	var a int = 30

	if a < 20 {
		fmt.Printf("a 小于 20\n")
	} else {
		fmt.Printf("a 大于 20\n")
	}
}

输出结果如下:

a 大于 20

1.3 if 嵌套语句

语法

Go 编程语言中 if…else 语句的语法如下:

if 布尔表达式 1 {
   // 在布尔表达式 1 为 true 时执行
   if 布尔表达式 2 {
      // 在布尔表达式 2 为 true 时执行
   }
}

此外,也可以在if中嵌套 if..else 语句等条件语句。

示例

package main

import "fmt"

func main() {
	var a int = 30
	var b int = 100

	if a == 30 {
		if b == 100 {
			fmt.Printf("a = %d, b = %d\n", a, b)
		}
	}
}

输出结果如下:

a = 30, b = 100

1.4 switch 语句

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

和其它语言不同的是:

  • switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break
  • switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 `fallthrough 。
  • switch 后面变量的类型可以是任何类型,不再局限于常量或整数。

语法

Go 编程语言中 switch 语句的语法如下:

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

变量 var1 可以是任何类型,而 val1val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。

您可以同时测试多个可能符合条件的值,使用逗号分割它们,例如:case val1, val2, val3

流程图如下:

2.4 Go语言从入门到精通:条件和循环_布尔表达式_04

示例

package main

import "fmt"

func main() {
	var grade string = "B"
	var marks int = 90

	switch marks {
	case 90:
		grade = "A"
	case 80:
		grade = "B"
	case 50, 60, 70:
		grade = "C"
	default:
		grade = "D"
	}

	switch {
	case grade == "A":
		fmt.Printf("优秀!\n")
	case grade == "B", grade == "C":
		fmt.Printf("良好\n")
	case grade == "D":
		fmt.Printf("及格\n")
	case grade == "F":
		fmt.Printf("不及格\n")
	default:
		fmt.Printf("差\n")
	}
	fmt.Printf("你的等级是 %s\n", grade)
}

输出结果如下:

优秀!
你的等级是 A

1.5 select 语句

2、循环语句

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。

以下为大多编程语言循环程序的流程图:

2.4 Go语言从入门到精通:条件和循环_循环语句_05

与多数语言不同的是,Go语言中的循环语句只支持 for 关键字,而不支持 whiledo-while 结构。

Go 语言提供了以下几种类型循环语句:

循环类型

描述

for 循环

重复执行相同逻辑的语句块。for 循环中也可以嵌套一个或多个 for 循环。在实际开发中,嵌套层数不要太深,一般2层即可。

for range 循环

能够帮助我们快速遍历数组、切片、哈希表以及 Channel 等集合类型。

在循环过程中,因实际需求需要在适当的条件下推出循环,此时循环控制语句则可以控制循环体内语句的执行过程。

GO 语言支持以下几种循环控制语句:

控制语句

描述

break 语句

经常用于中断当前 for 循环或跳出 switch 语句

continue 语句

跳过当前循环的剩余语句,然后继续进行下一轮循环。

goto 语句

将控制转移到被标记的语句。

2.1 for 循环

语法

Go 语言 for 循环更加的灵活,有三种形式:

for init; condition; post {
	// 循环体
}

类似于do while:

for condition {
	// 循环体
}

无限循环:

for {
	// 循环体
}
  • init: 一般为赋值表达式,给控制变量赋初值。
  • condition: 关系表达式或逻辑表达式,循环控制条件。
  • post: 一般为赋值表达式,给控制变量增量或减量。

示例

求 1~100之间的求和,示例如下:

package main

import "fmt"

func main() {
	sum := 0
	for i := 1; i <= 100; i++ {
		sum += i
	}
	fmt.Println(sum)
}

2.2 for range 循环

除了使用经典的三段式循环之外,Go 语言还引入了一个新的关键字 range,用于帮助我们快速遍历数组等集合类型,非常简洁好用,成为了数组遍历的标配。

语法

for k,v := range arr {
	// 循环体
}
  • k:数组 arr 的索引。
  • v:数组 arr 对应索引 k 的值。

示例

循环输出一个数组中的所有数据,示例如下:

package main

import "fmt"

func main() {
	arr := []string{"A", "B", "C", "D"}
	for k, v := range arr {
		fmt.Printf("arr[%d]=%s\n", k, v)
	}
}

输出结果如下:

arr[0]=A
arr[1]=B
arr[2]=C
arr[3]=D

2.3 break 语句

Go 语言中 break 语句用于以下三方面:

  • 用于循环语句中跳出循环,并开始执行循环之后的语句。
  • breakswitch 中在执行一条 case 后跳出语句的作用。
  • 在多重循环中,可以用标号 label 标出想 break 的循环。

语法

break

示例

示例如下:

package main

import "fmt"

func main() {
	var a int = 10
	for a < 20 {
		fmt.Printf("a=%d\n", a)
		a++

		if a > 15 {
			break
		}
	}

}

输出结果如下:

a=10
a=11
a=12
a=13
a=14
a=15

使用多重循环,演示使用标记和不使用标记的区别,示例2如下:

package main

import "fmt"

func main() {

    // 不使用标记
    fmt.Println("---- break ----")
    for i := 1; i <= 3; i++ {
        fmt.Printf("i: %d\n", i)
                for i2 := 11; i2 <= 13; i2++ {
                        fmt.Printf("i2: %d\n", i2)
                        break
                }
        }

    // 使用标记
    fmt.Println("---- break label ----")
    re:
        for i := 1; i <= 3; i++ {
            fmt.Printf("i: %d\n", i)
            for i2 := 11; i2 <= 13; i2++ {
                fmt.Printf("i2: %d\n", i2)
                break re
            }
        }
}

输出结果如下:

---- break ----
i: 1
i2: 11
i: 2
i2: 11
i: 3
i2: 11
---- break label ----
i: 1
i2: 11

2.4 continue 语句

Go 语言的 continue 语句 有点像 break 语句。但是 continue 不是跳出循环,而是跳过当前循环执行下一次循环语句。

语法

continue

示例

示例如下:

package main

import "fmt"

func main() {
	var a int = 10
	for a < 20 {
		fmt.Printf("a=%d\n", a)
		a++

		if a > 15 {
			continue
		}
        fmt.Printf("****\n")
	}
}

输出结果如下:

a=10
****
a=11
****
a=12
****
a=13
****
a=14
****
a=15
a=16
a=17
a=18
a=19

2.5 goto 语句

Go 语言的 goto 语句可以无条件地跳转到任意指定位置。

goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。(这与Java 语言中一样,不推荐使用。)

语法

goto label
..
.
label: statement

示例

示例如下:

package main

import "fmt"

func main() {
	var b int = 10
	for b < 20 {
		fmt.Printf("b=%d\n", b)
		b++

		if b > 15 {
			goto print
		}

	}

print:
	fmt.Printf("****\n")

}

输出结果如下:

b=10
b=11
b=12
b=13
b=14
b=15
****


标签:语句,case,入门,示例,fmt,循环,Go,main,2.4
From: https://blog.51cto.com/xcbeyond/6190016

相关文章

  • 2.3 Go语言从入门到精通:数据类型
    文章目录1、基本数据类型1.1布尔型1.2数值型1.2.1整型1.2.2浮点型1.2.3复数1.3字符串型2、派生数据类型2.1指针2.2数组2.3结构体2.4通道(channel)2.5切片(slice)2.6函数2.7接口(interface)2.8Map3、其他3.1数据类型转换3.2类型别名4、小结Go语言是一种静态类型的......
  • 3.3 Go语言从入门到精通:包管理工具之Govendor
    Govendor是Go的另一个依赖包管理工具,它的出现可以避免不同用户在clone同一个工程后从外部获取不同依赖库版本的问题,很好的弥补了GOPATH包管理的缺陷。govendor会将工程需要的依赖包添加到工程的vendor目录下,并且该目录中vendor.json文件会保存添加的依赖包的路径等信息......
  • 3.1 Go语言从入门到精通:包
    Go语言像Java语言一样都拥有包的概念,通过使用包来组织源代码。包(package)是多个Go源码的集合,是一种高级的代码复用方案。Go语言中为我们提供了很多内置包,如fmt、os、io等。任何Go源代码文件都必属于某个包,同时源码文件的第一行有效代码必须是packagepacakgeName语句,通过......
  • 3.2 Go语言从入门到精通:包管理工具之GOPATH
    当我们真正用Go去做项目,或者阅读Go项目(如,Go实现的开源项目)时,不可避免的会遇到包依赖问题,一些包管理方式总是很难区分、选择。Go的包管理与Java的Maven依赖管理不太一样,起初Go的包管理方式经常会被人吐槽,但随之Go版本的升级也出现了不同的包管理方式,以满足不同的需求。今天,我们......
  • SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null];
    网上解决方案1.起初没有创建序列s_log,因此需要在Oracle补上s_log序列。<!--增加日志--><insertid="logSave"parameterClass="com.reportcenter.sys.dto.OperateLogDto">INSERTINTOT_LOG(C_AUTOID,USRCDE,USRADDRESS,OPERATION,BEGINTME,ENDTME,OPER......
  • 又一款入门级嵌入式开发平台!米尔STM32MP135核心板新品发布
    自2007年意法半导体(ST)推出STM32首款Cortex-M内核MCU,十几年来,ST在MCU领域的发展是飞速向前的。而2019年ST发布了全新的STM32MPU系列产品线,STM32MP1作为新一代MPU的典范,有着极富开创意义的异构系统架构兼容并蓄了MPU和MCU双重优势,受到业界的喜爱!米尔电子作为ST官方合作伙伴,在......
  • Go For Web:一篇文章带你用 Go 搭建一个最简单的 Web 服务、了解 Golang 运行 web 的原
    前言:本文作为解决如何通过Golang来编写Web应用这个问题的前瞻,对Golang中的Web基础部分进行一个简单的介绍。目前Go拥有成熟的Http处理包,所以我们去编写一个做任何事情的动态Web程序应该是很轻松的,接下来我们就去学习了解一些关于Web的相关基础,了解一些概念,以及......
  • google + chatgpt
    google注册网址:https://www.google.com/使用右上角登录按钮点击创建账户然后根据步骤注册chagpt注册1.https://chat.openai.com/auth/login2.1页面用不了的情况就用2使用下面的chatgpt的continuewithgoogle。然后登录谷歌账号之后按步骤即可......
  • Django Admin SimpleUI 自定义列
    DjangoAdminSimpleUI的一些简单用法注意事项:自定义列会遍历所有取出来的数据,需注意先定义下模型#models.pyclassDog(models.Model):name=models.CharField(max_length=15,verbose_name='小狗名字')age=models.IntegerField(verbose_name='小狗年龄',defa......
  • Vue2入门之超详细教程六-数据代理
    1、简介这章有点长,希望大家可以耐心看完。在了解数据代理之前需要先了解Object.defineProperty,Object.defineProperty就是给一个对象添加属性用的。数据代理,通过一个对象代理对另一个对象中数据的操作(读/写)。Vue中的数据代理:通过vm对象来代理data对象中的数下......