Golang 中的流程控制

news2024/11/29 4:54:00

1Golang 中的流程控制

Go 语言中最常用的流程控制有 if for ,而 switch goto 主要是为了简化代码、降低重复
代码而生的结构,属于扩展类的流程控制。

2if else(分支结构)

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

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

   • 可省略条件表达式括号。
    • 持初始化语句,可定义代码块局部变量。 
    • 代码块左 括号必须在条件表达式尾部。

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

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

	flag := true
	a := 10
	if flag{
		for i := 0; i < a; i++ {
			fmt.Print(i)
		}
	}else{
		fmt.Print("为假")
	}
 *不支持三元操作符(三目运算符) "a > b ? a : b"。   
package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 100
   var b int = 200
   /* 判断条件 */
   if a == 100 {
       /* if 条件语句为 true 执行 */
       if b == 200 {
          /* if 条件语句为 true 执行 */
          fmt.Printf("a 的值为 100 , b 的值为 200\n" )
       }
   }
   fmt.Printf("a 值为 : %d\n", a )
   fmt.Printf("b 值为 : %d\n", b )
}     
  a 的值为 100 , b 的值为 200
    a 值为 : 100
    b 值为 : 200  
注意: Go 语言规定与 if 匹配的左括号 { 必须与 if 和表达式放在同一行, { 放在其他位置会触
发编译错误。 同理,与 else 匹配的 { 也必须与 else 写在同一行, else 也必须与上一个 if
else if 右边的大括号在同一行。

 2if 条件判断特殊写法

if 条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值
进行判断,举个例子:
	if age := 21 ;age >18{
		fmt.Print("成年人")
	}else{
		fmt.Print("未成年人")
	}

3 探讨上面两种写法的区别

	age := 30 
	if age > 20 {
		fmt.Println("成年人", age)
	}
	fmt.Println(age)

//当前区域内是全局变量,在if结构体外也可以打印出来

	if age := 34; age > 20 {
		fmt.Println("成年人", age)
	}
	fmt.Println(age)

  //局部变量,只能在if结构体内打印出来

 4、输入一个人的成绩,如果成绩大于等于90输出A,如果小于90大于75输出B,否则输出C

package main

import (
	"fmt"
	// "go/format"
	// "go/importer"
)

func main() {

	var score = 75
	if score >= 90 {
		fmt.Println("A")
	} else if score > 75 {
		fmt.Println("B")
	} else {
		fmt.Println("C")
	}
package main

import (
	"fmt"
	// "go/format"
	// "go/importer"
)

func main() {

	if score := 85; score >= 90 {
		fmt.Println("A")
	} else if score > 75 {
		fmt.Println("B")
	} else {
		fmt.Println("C")
	}

3、if else要注意的细节

1、if{}不能省略掉

2、 { 必须紧挨着条件

2、for(循环结构)

Golang for支持三种循环方式,包括类似 while 的语法。

语法

Go语言的For循环有3中形式,只有其中的一种使用分号。

   for init; condition; post { }
    for condition { }
    for { }
    init: 一般为赋值表达式,给控制变量赋初值;
    condition: 关系表达式或逻辑表达式,循环控制条件;
    post: 一般为赋值表达式,给控制变量增量或减量。
    for语句执行过程如下:
    ①先对表达式 init 赋初值;
    ②判别赋值表达式 init 是否满足给定 condition 条件,若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。

for 初始语句;条件表达式;结束语句{

                        循环体语句
}

 打印1-10的所有数据(三种方式,其一)

        for 初始语句;条件表达式;结束语句{

            循环体语句

        }

	for i := 1; i <= 10; i++ {
		fmt.Println(i)
	}

        for循环的执行流程

            1、i := 1

            2、i <= 10

            3、执行花括号里面的语句

            4、i++

            5、i <= 10

            6、执行花括号里面的语句

            7、i++

            8、i <= 10

 打印1-10的所有数据(三种方式,其二)

        for 条件 {

            循环体语句

        }

for 循环的初始语句和结束语句都可以省略,例如 

 for 循环的初始语句可以被忽略,但是初始语句后的分号必须要写

	i := 1
	for ; i <= 10; i++ {
		fmt.Println(i)
	}

 打印1-10的所有数据(三种方式,其三)

        for {

            循环体语句

        }

注意:Go 语言中是没有 while 语句的,我们可以通过 for 代替 

	i := 1
	for i <= 10 {
		fmt.Println(i)
		i++
	}

for 无限循环 

for {
循环体语句
}
package main

import "fmt"

func main() {


	i := 1
	for {
		if i <= 10 {
			fmt.Println(i)
		} else {
			break //跳出循环
		}
		i++
	}

}

for和if的练习几则

打印 0-50 所有的偶数

i := 0
	count := 0
	for ; i <=50; i++ {
		if i%2 == 0{
			count += 1
			fmt.Println(i)
		}
	}
	fmt.Printf("0-50 所有的偶数一共有%v个",count)

 求 1+2+3+4 +...100 的和

	i :=1
	sum := 0
	for ; i <= 100; i++ {
		sum += i
		
	}
	fmt.Println("1到100的和为",sum)

打印 1~100 之间所有是 9 的倍数的整数的个数及总和

	sum := 0
	count := 0
	for i := 1; i <= 100; i++ {
		if i % 9 ==0{
			sum += i
			count++
		}

	}
	fmt.Printf("1到100内9的倍数的整数个数为%v,总和为%v",count,sum)

 计算 5 的阶乘 (12345 n 的阶乘 12……n)   1*2*3*4*5

	var sum = 1
	for i := 1; i <= 5; i++ {
		sum *= i
	}
	fmt.Println(sum)

打印一个矩形 (for循环的嵌套)

        for循环嵌套的一个执行流程

        1、i=0   打印4个*   一个换行

        2、i=1   打印4个*   一个换行

        3、i=2   打印4个*   一个换行

        4、i=3  跳出循环

	var row = 3
	var column = 4
	for i := 0; i < row; i++ {
		for j := 0; j < column; j++ {
			fmt.Print("*")
		}
		fmt.Println("")
	}

 

打印一个三角形

	var row = 5
	for i := 1; i <= row; i++ {
		for j := 1; j <= i; j++ {
			fmt.Print("#")
		}
		fmt.Println("")
	}

打印出九九乘法表 

	for i := 1; i <= 9; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%v*%v=%v \t", j, i, i*j)
		}
		fmt.Println("")
	}

循环语句range

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:

for key, value := range oldMap {
    newMap[key] = value
}   
1st value2nd value
stringindexs[index]unicode, rune
array/sliceindexs[index]
mapkeym[key]
channelelement
通过 for  range 遍历的返回值有以下规律:
1. 数组、切片、字符串返回索引和值。
2. map 返回键和值。
3. 通道(channel)只返回通道内的值
package main

import "fmt"

func main() {

	var str = "卫宫士郎"
	for k, v := range str {
		fmt.Printf("下标对应的key为%v,对应的value为%c\n", k, v)

	}

	// 使用for range来遍历一个数组
	var str1 = [...]string{"宫本樱","远坂应","卫宫巨侠"}
	for k, val := range str1 {
		fmt.Printf("数组内下标为%v为%v\n",k,val)
		
	}
}

 可忽略不想要的返回值,或 "_" 这个特殊变量。

 条件语句switch

使用 switch 语句可方便地对大量的值进行条件判断。

语法

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

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

其中的default类似if判断中的else 

练习:判断对应主角的servant,反馈职阶

	var servant = "sabar"
	if servant == "rider" {
		fmt.Print("rider 骑士职阶")
	}else if  servant == "sabar" {
		fmt.Print("sabar 圣剑职阶")
	}else if servant == "archer" {
		fmt.Print("archer 弓箭手职阶")
	}else{
		fmt.Print("目前未收录该职阶")
	}

 1、switch case的基本使用

	var servant = "archer"
	switch servant {
	case "sabar":
		fmt.Print("sabar 圣剑职阶")
		break
	case "archer":
		fmt.Print("archer 弓箭手职阶")
		break
	case "rider":
		fmt.Print("rider 骑士职阶")
		break
	default:
		fmt.Print("目前未收录该职阶")
	}
Go 语言规定每个 switch 只能有一个 default 分支。
Go 语言中每个 case 语句中可以不写 break 不加 break 也不会出现穿透的现象.

2、switch case的另一种写法

	switch servant := "rider"; servant {
	case "sabar":
		fmt.Print("sabar 圣剑职阶")
		break
	case "archer":
		fmt.Print("archer 弓箭手职阶")
		break
	case "rider":
		fmt.Print("rider 骑士职阶")
		break
	default:
		fmt.Print("目前未收录该职阶")
	}

 3、一个分支可以有多个值,多个 case 值中间使用英文逗号分隔

判断一个数是不是偶数

	var n = 8
	switch n {
	case 1, 3, 5, 7, 9:
		fmt.Println("奇数")
		break //golang中break可以写也可以不写
	case 2, 4, 6, 8, 10:
		fmt.Println("偶数")
		break
	}

及格不及格

	var score = "D" //ABC及格  D不及格
	switch score {
	case "A", "B", "C":
		fmt.Println("及格")
	case "D":
		fmt.Println("不及格")
	}

	// ABC及格  D不及格
	switch score := "D"; score {
	case "A", "B", "C":
		fmt.Println("及格")
	case "D":
		fmt.Println("不及格")
	}

4、分支还可以使用表达式,这时候 switch 语句后面不需要再跟判断变量。

	var age = 20
	switch {
	case age >= 18:
		fmt.Print("大于18岁,需要全价门票")
	case age < 18:
		fmt.Print("小于18岁,需要半价价门票")
	case age >60 :
		fmt.Print("年龄过大,不建议入内")
	default:
		fmt.Print("免票入内")
	}

5、 switch 的穿透 fallthrought

fallthrough`语法可以执行满足条件的 case 的下一个 case,是为了兼容 C 语言中的 case 设计的

		var age = 20
	switch {
	case age >= 18:
		fmt.Print("我要找到你\n")
		fallthrough
	case age < 18:
		fmt.Print("试探你眼睛\n")
		fallthrough
	case age >60 :
		fmt.Print("心无旁骛的\n")
		fallthrough
	default :
		fmt.Print("相拥")
	}

break(跳出循环)

Go 语言中 break 语句用于以下几个方面:
用于循环语句中跳出循环,并开始执行循环之后的语句。
break 在 switch(开关语句)中在执行一条 case 后跳出语句的作用
在多重循环中,可以用标号 label 标出想 break 的循环。

比如: 当i=3的时候跳出当前循环

	for i := 1; i <= 10; i++ {
		if i == 3 {
			break
		}
		fmt.Println(i)
	}
	fmt.Println("继续")

	for i := 0; i < 2; i++ {
		for j := 0; j < 10; j++ {
			if j == 3 {
				break
			}
			fmt.Printf("i=%v j=%v\n", i, j)
		}
	}

 循环流程:外部先循环首次,然后进到内部,然后再在内部循环完毕再回外层。 

 for 循环中默认 break 只能跳出一层循环

2. break 在 switch(开关语句)中在执行一条 case 后跳出语句的作用 

	switch servant := "rider"; servant {
	case "sabar":
		fmt.Print("sabar 圣剑职阶")
		break
	case "archer":
		fmt.Print("archer 弓箭手职阶")
		break
	case "rider":
		fmt.Print("rider 骑士职阶")
		break
	default:
		fmt.Print("目前未收录该职阶")
	}

3.在多重循环中,可以用标号 label 标出想 break 的循环。

// lable1:
// 	for i := 0; i < 2; i++ {
// 		for j := 0; j < 10; j++ {
// 			if j == 3 {
// 				break lable1
// 			}
// 			fmt.Printf("i=%v j=%v\n", i, j)
// 		}
// 	}

sabar:
for i := 1; i < 8; i++ {
	for j :=1 ;j<9;j++{
		if j == 3{
			break sabar
		}
		fmt.Printf("i=%v j=%v\n", i, j)
	}

 continue(继续下次循环)

 continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用。

	for i := 1; i <= 10; i++ {

		if i == 3 {
			continue
		}
		fmt.Println(i)
	}

 

	for i := 0; i < 2; i++ {
		for j := 0; j < 5; j++ {
			if j == 3 {
				continue
			}
			fmt.Printf("i=%v j=%v\n", i, j)
		}
	}

 

 在 continue 语句后添加标签时,表示开始标签对应的循环

archer:
	for i := 0; i < 2; i++ {
		for j := 0; j < 5; j++ {
			if j == 3 {
				continue archer
			}
			fmt.Printf("i=%v j=%v\n", i, j)
		}
	}

goto(跳转到指定标签) 

goto 语句通过标签进行代码间的无条件跳转。goto 语句可以在快速跳出循环、避免重复退 出上有一定的帮助。Go 语言中使用 goto 语句能简化一些代码的实现过程

	var n = 30
	if n > 24 {
		fmt.Println("位置1")
		goto sabar

	}

	fmt.Println("位置2")
	fmt.Println("位置3")
sabar:
	fmt.Println("位置4")
	fmt.Println("位置5")

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

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

相关文章

JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)

目录 SQL注入 JDBC批量添加数据 JDBC事务处理 Blob类型的使用 插入Blob类型数据 其他查询方式 动态条件查询 SQL注入 什么是SQL注入 所谓 SQL 注入&#xff0c;就是通过把含有 SQL 语句片段的参数插入到需要 执行的 SQL 语句中&#xff0c; 最终达到欺骗数据库服务器执行…

如何将各个阶段的数据进行对比?Sugar BI 教你快速搞定

折线图可以将当前和某个时间段的数据进行对比&#xff0c;比如前一天、上周、去年。 数据对比开启条件 当折线图 X 轴有且只有一个日期或时间字段&#xff0c;并且聚合方式为年-xx&#xff0c;Y 轴有且只有一个度量字段时&#xff0c;可以开启并配置折线图数据对比。 支持数据…

VMware使用ubuntu虚拟机的一些使用技巧

VMware安装Ubuntu虚拟机一般相对比较容易&#xff0c;本文记录一些VMware使用ubuntu虚拟机的其他使用技巧。 一、Ubuntu共享文件夹 1.1、 挂载镜像文件&#xff1a; 虚拟机->设置->硬件->CD/DVD.右边“连接”下面选择“使用IOS镜像文件”&#xff0c;浏览选择虚拟机…

【独家揭秘】微信居然可以自动通过好友申请并自动打招呼啦!

最近有客户来咨询&#xff0c;说是因为做内容引流到微信&#xff0c;所以每天很多人加她&#xff0c;微信都快被加爆了&#xff0c;每天手动通过好友申请和打招呼&#xff0c;回答了很多一模一样的问题&#xff0c;就一个小时已经让她很疲惫了&#xff0c;很机械的重复这些事。…

caj文件怎么转成pdf文件格式?分享两个免费方法!

在数字化的世界中&#xff0c;文件格式转换是我们日常生活和工作中常见的需求。CAJ文件是中国学术文献网络出版总库使用的一种文件格式&#xff0c;而PDF是全球广泛接受的文件格式&#xff0c;具有良好的兼容性和稳定性。本文将介绍两种免费的方法&#xff0c;帮助你将CAJ文件转…

细节:双花括号({{ ... }})在Vue.js中的用法

问题&#xff1a; 为什么后端返回的是数字类型时&#xff0c; {{ form.orderPrice }}可以拿到值展示&#xff0c; {{ form.orderPrice || "-" }} 不可以&#xff1f; 接口返回数据&#xff1a; <el-form-item label"订单金额&#xff1a;" prop"…

2.0 熟悉CheatEngine修改器

Cheat Engine 一般简称为CE&#xff0c;它是一款功能强大的开源内存修改工具&#xff0c;其主要功能包括、内存扫描、十六进制编辑器、动态调试功能于一体&#xff0c;且该工具自身附带了脚本工具&#xff0c;可以用它很方便的生成自己的脚本窗体&#xff0c;CE工具可以帮助用户…

shader学习记录——彩色光圈

参考连接 https://blog.csdn.net/stalendp/article/details/21993227 Shader "Custom/ColorRingShader" {Properties{_MainTex ("Texture", 2D) "white" {}}SubShader{Tags { "RenderType""Opaque" }LOD 100Pass{CGPROGRA…

fastapi docs打开为空白解决办法

空白的原因 使用的cdn为国外cdn 解决办法 使用国内cdn 解决步骤 1.打开此文件D:\Program Files\Python\Lib\site-packages\fastapi\openapi\docs.py 2.修改cdn地址 国内cdn不好找呀 &#xff08;1&#xff09;.七牛云存储 开放静态文件CDN&#xff0c;地址&#xff1a;h…

ubuntu20离线安装nodejs、GO、go.rice及yarn

虽然是离线安装&#xff0c;但该有的安装包还是需要的… 目录 1、安装nodejs1.1查看本地是否存在nodejs1.2创建nodejs文件夹1.3下载nodejs二进制文件1.4解压并改名1.5添加软连接 2安装GO2.1创建go文件夹2.2下载go二进制文件2.3解压文件2.4添加环境变量2.5设置sudo可执行go命令…

C++11 function包装器

前言 在C中&#xff0c;有三种可调用对象&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda表达式。 三者有相似的作用和效果&#xff0c;但使用形式有很大的差异。 为了进行统一&#xff0c;C11引进了function包装器 文章目录 前言一. function的使用二. function对…

DataGrip连接clickhouse数据库后,左侧不显示库中的表

一、问题描述 使用datagrip链接clickhouse&#xff0c;本来左侧时可以显示数据库中对应的表的列表的。但是&#xff0c;这个链接clickhouse不显示。 二、问题解决 参考一些文档后&#xff0c;而且因为当前采用的时2023.1.2的版本&#xff0c;所以&#xff0c;选项有些改变。…

记录AndroidStrudio打包报错与解决方案(一)

问题一&#xff1a;打包报错 Unity.IL2CPP.Building.BuilderFailedException: C:\Users\user\AppData\Local\Android\Sdk\ndk\21.0.6113669\toolchains\llvm\prebuilt\windows-x86_64\bin\clang "C:\Users\user\AppData\Local\Temp\tmp7277.tmp" -o "D:\Buil…

Linux计划任务crontab

顺序是可以任意的, 任意指的是,选项可以都放前面 变量放后面 或者一个选项 一个选项对应的命令 df 查看文件占有情况 d1 只显示1级深度 -h格式好看点 显示所有用户进程和内存进程. uid是所属用户 PPID是父进程 kill终止进程 杀死进程&#xff0c;是正常退出。 如果普通杀不…

数据智能交融,AI引领未来 | 数说故事成为华为云盘古大模型3.0首批联创单位之一

7月7日-9日&#xff0c;华为开发者大会2023&#xff08;Cloud&#xff09;在东莞举行&#xff0c;并在7日下午正式对外发布“华为云盘古大模型3.0”。盘古大模型3.0围绕行业重塑、技术扎根、开放同飞三大方向&#xff0c;持续打造核心竞争力&#xff0c;为行业客户、伙伴及开发…

疯狂收割offer,软件测试面试题,项目经验板块常问(附答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

CCLINK转MODBUS-TCP网关cclink利modbus区别

大家好&#xff0c;今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议&#xff0c;它们的不同使得数据互通比较困难&#xff0c;但远创智控YC-CCLK-TCP网关的出现改变了这一切。 1&#xff0c; 远创智控YC-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关&#xff…

快讯丨北京市委书记尹力到极智嘉调研指导

据北京日报7月4日报道&#xff0c;2023全球数字经济大会开幕前夕&#xff0c;市委书记尹力围绕“深入学习贯彻新时代中国特色社会主义思想&#xff0c;推进全球数字经济标杆城市建设”&#xff0c;到海淀区、朝阳区调查研究。 7月3日下午&#xff0c;北京市委书记尹力到极智嘉全…

一分钟让你学会文件的打开与关闭函数

文章目录 前言文件打开函数-fopen函数介绍文件的打开形式相对路径与绝对路径 文件关闭函数-fclose文件操作正确流程 前言 我们已经了解了文件基本概念&#xff0c;那么我们如何通过代码对某一个文件进行一些文件操作呢&#xff1f;比如如何打开文件、关闭文件以及如何向文件中…

promQL详细语法介绍

目录 promQL 在表达式中支持的数据类型 简单语法介绍 rate的用法 指标过滤搜索 时间单位 聚合表达式 11个聚合函数 二元运算符&#xff08;Binary Operators&#xff09; 二元运算符优先级 向量匹配 向量一对一匹配 向量一对多/多对一匹配 promQL 在表达式中支持的数据…