GoLong的学习之路(四)语法之循环语句

news2024/11/15 18:07:17

书接上回,上回说到运算符,这次我们说一个编程语言中最重要的一点:流程控制,及循环语句

文章目录

  • 循环语句
    • if else(分支结构)
      • if条件判断特殊写法
    • for(循环结构)
      • for range(键值循环)
    • switch case
    • goto(跳转到指定标签)
    • break(跳出循环)(标签)
    • continue(继续下次循环)

循环语句

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

if else(分支结构)

Go语言规定与if匹配的左括号{必须与if和表达式放在同一行,{放在其他位置会触发编译错误。

if 表达式1 {
    分支1
} else if 表达式2 {
    分支2
} else{
    分支3
}

当表达式1的结果为true时,执行分支1,否则判断表达式2,如果满足则执行分支2,都不满足时,则执行分支3

这里不需要像java一样将表达式放进括号里。就算放进去也会消失,并不报错。

import "fmt"

func main() {
	score := 65
	if score >= 90 {
		fmt.Println("A")
	} else if score > 75 {
		fmt.Println("B")
	} else {
		fmt.Println("C")
	}
}

在这里插入图片描述

if条件判断特殊写法

if条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断。

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

与之上有什么问题?看下面
在这里插入图片描述
哈?报错了。其实也能理解,此时score从属于main的局部变量成为了if…else 的局部变量

for(循环结构)

Go 语言中的所有循环类型均可以使用for关键字来完成。

for 初始语句;条件表达式;结束语句{
    循环体语句
}

条件表达式返回true时循环体不停地进行循环,直到条件表达式返回false时自动退出循环。

import "fmt"

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

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

import "fmt"

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

for循环的初始语句和结束语句都可以省略。(此时类似与java的while)

import "fmt"

func main() {
	i := 0
	for i < 10 {
		fmt.Println(i)
		i++
	}
}

for循环可以通过break、goto、return、panic语句强制退出循环。

for range(键值循环)

Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。

通过for range遍历的返回值有以下规律:

  1. 数组、切片、字符串返回,索引和值。
  2. map返回,键和值。
  3. 通道(channel)只返回通道内的值(类似与队列)
func main() {
	var a = [...]string{"北京", "上海", "深圳"}
	// 方法1:for循环遍历
	for i := 0; i < len(a); i++ {
		fmt.Println(a[i])
	}

	// 方法2:for range遍历
	for index, value := range a {
		fmt.Println(index, value)
	}
}

switch case

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

Go语言规定每个switch只能有一个default分支。

import "fmt"

func main() {
	finger := 3
	switch finger {
	case 1:
		fmt.Println("A")
	case 2:
		fmt.Println("B")
	case 3:
		fmt.Println("C")
	case 4:
		fmt.Println("D")
	case 5:
		fmt.Println("E")
	default:
		fmt.Println("无效")
	}
}

这里与Java不同,java在美国case下必须要有break不然,就会运行出大问题(Bug与预期结果不符)

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


import "fmt"

func main() {
	switch n := 7; n {
	case 1, 3, 5, 7, 9:
		fmt.Println("奇数")
	case 2, 4, 6, 8:
		fmt.Println("偶数")
	default:
		fmt.Println(n)
	}
}

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

func main() {
	age := 30
	switch {
	case age < 25:
		fmt.Println("好好学习吧")
	case age > 25 && age < 35:
		fmt.Println("好好工作吧")
	case age > 60:
		fmt.Println("好好享受吧")
	default:
		fmt.Println("活着真好")
	}
}

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

import "fmt"

func main() {
	s := "a"
	switch {
	case s == "a":
		fmt.Println("a")
		fallthrough
	case s == "c":
		fmt.Println("c")
	case s == "b":
		fmt.Println("b")
	default:
		fmt.Println("...")
	}
}

结果
在这里插入图片描述

goto(跳转到指定标签)

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

func main() {
	var breakFlag bool
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				breakFlag = true
				break
			}
			fmt.Printf("%v-%v\n", i, j)
		}
		// 外层for循环判断
		if breakFlag {
			break
		}
	}
}
import "fmt"

func main() {
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				// 设置退出标签
				goto breakTag
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	return
	// 标签
breakTag:
	fmt.Println("结束for循环")

使用goto语句能简化代码,直接跳出循环

break(跳出循环)(标签)

break语句可以结束for、switch和select的代码块。(上面的例子其实就有,java语法中也存在)

break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的for、switch和 select的代码块上。


import "fmt"

func main() {
BREAKDEMO1:
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if j == 2 {
				break BREAKDEMO1
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
	fmt.Println("结束")
}

按原本的不加标签的方式,break只会终止内循环,外循环在这个代码中一定会被判条件为否时,弹出。而此时,我们可以根据需要增加。

continue(继续下次循环)

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

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

func main() {
forloop1:
	for i := 0; i < 5; i++ {
		// forloop2:
		for j := 0; j < 5; j++ {
			if i == 2 && j == 2 {
				continue forloop1
			}
			fmt.Printf("%v-%v\n", i, j)
		}
	}
}

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

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

相关文章

2022年京东双11母婴品类数据回顾

母婴产品作为部分家庭的刚需&#xff0c;双11期间的行业热度也节节攀升&#xff0c;2022年双11期间&#xff0c;行业中不少品类赛道势头猛进。下面&#xff0c;鲸参谋带大家一起来回顾2022年双11期间母婴行业大盘及母婴重点细分赛道的销售表现。 母婴行业大盘 2022年双11期间&a…

基于鲸鱼算法的无人机航迹规划-附代码

基于鲸鱼算法的无人机航迹规划 文章目录 基于鲸鱼算法的无人机航迹规划1.鲸鱼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鲸鱼算法来优化无人机航迹规划。 1.鲸鱼搜索算法 …

微积分(二) 导数与微分

前言 导数反映了函数值相对于自变量的变化快慢程度&#xff0c;而微分则表明当自变量有微小变化时&#xff0c;函数值大体上变化多少 瞬时速度的解决——极限 牛顿采用了一种无限逼近的方法。 平均速度的定义:如果一个物体在一段时间△t内位移了s,它在这段时间内的平均速度…

二进制明文字符串加密:还原与反还原

背景 上一篇文章中介绍了xorstr的原理和最小化验证概念的代码&#xff0c;这篇文章来看下这种已经被广泛应用于各恶意样本以及安全组件中的技术如何还原&#xff0c;如果还没看上篇建议先看下了解其实现后再看本篇文章 xorstr的现状 随着相关技术的应用越来越广&#xff0c;…

最新咸鱼签名JS逆向分析教程

本章教程,主要分享一下咸鱼H5网页端sign签名算法。 案例地址:https://h5.m.goofish.com/item?id=744640763988 程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 目录 一、参数分析 二、逆向过程

TCmalloc (google开源项目核心部分模拟实现)

1什么是内存池 1.1池化技术 所谓“池化技术”&#xff0c;就是程序先向系统申请过量的资源&#xff0c;然后自己管理&#xff0c;以备不时之需。之所以要申请过 量的资源&#xff0c;是因为每次申请该资源都有较大的开销&#xff0c;不如提前申请好了&#xff0c;这样使用时就…

橙河网络:国外问卷调查赚钱的项目可靠吗?

国外问卷调查项目是可靠的&#xff0c;是一个长期稳定的互联网项目。 大家好&#xff0c;我是橙河网络&#xff0c;今天聊一聊国外问卷调查赚钱的项目可靠吗&#xff1f; 在海外地区&#xff0c;很多公司和机构&#xff0c;它们为了收集一些关于产品和服务的消费者意见&#…

读懂Json文件[妈妈再也不用担心我不读懂了]

第一次见到它&#xff0c;我特别害怕&#xff0c; 很大一个文件&#xff0c;还是二进制的&#xff0c;是什么意思呢&#xff1f;该文件是深度学习模型训练完成之后由模型的输出数据保存的结果数据&#xff1b; 在线JSON编译器 JSON Editor Online 把文件传上去&#xff01; …

React-native-camera 在小米手机上拍照查看闪退

场景&#xff1a;为实现可拍照和录像的相机用react-native-camera这个库手写一个相机&#xff0c;发现了拍出来的图片在小米10上查看闪退 根据手机后台捕获的错误信息是什么玩意太大了&#xff08;之前还以为是图片显示组件的问题&#xff09; 改进&#xff1a;相机吊起的时候…

unity中使用protobuf工具将proto文件转为C#实体脚本

unity中使用protobuf工具将proto文件转为C#实体脚本 介绍优点缺点Protobuf 为什么比 XML 快得多&#xff1f;Protobuf的EncodingProtobuf封解包的过程通常编写一个Google Protocol Buffer应用需要以下几步&#xff1a; Protostuff是什么Protobuf工具总结 介绍 protobuf也就是G…

第三章Maven依赖的特性-基础篇

文章目录 Maven依赖核心配置文件pom.xml依赖的范围概念compile 和 test 对比compile 和 provided 对比结论 测试验证 compile 范围对 main 目录有效验证test范围对main目录无效验证test和provided范围不参与服务器部署验证provided范围对测试程序有效 依赖的传递概念传递的原则…

计算机体系结构实验三-缓存一致性

最近在看CMU15-418&#xff0c;LECTURE10-11就是讲两个缓存一致性协议&#xff0c;刚好这部分内容在实验中学习过&#xff0c;在实验中监听式协议提到的是MSI协议(modified&#xff0c;shared&#xff0c;invalid)&#xff0c;lecture中还讲了优化的版本MESI(应该是实际使用的协…

pytorch 入门 (四)案例二:人脸表情识别-VGG16实现

实战教案二&#xff1a;人脸表情识别-VGG16实现 本文为&#x1f517;小白入门Pytorch内部限免文章 参考本文所写记录性文章&#xff0c;请在文章开头注明以下内容&#xff0c;复制粘贴即可 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参…

CSMM软件能力成熟度评估

CSMM认证&#xff0c;又称为“软件能力成熟度评估”&#xff0c;也有地方称为“CSMM软件能力成熟度模型评估国家标准认证”&#xff0c;也被民间喊作“中国版CMMI认证”。该标准于2021年6月8日发布&#xff0c;是我国自主标准&#xff0c;适合中国国情以及中国软件企业的特点。…

2023腾讯云服务器价格表(轻量/CVM/免费/GPU)

腾讯云服务器租用价格表&#xff0c;轻量应用服务器、云服务器CVM、免费云服务器申请和GPU云服务器配置报价&#xff0c;轻量2核2G4M价格108元一年、2核4G6M带宽159元一年、4核8G10M优惠价425元一年、8核16G14M优惠价1396元一年、16核32G20M价格2775.99元一年&#xff0c;云服务…

Cesium冷知识:API中显示私有方法

在Cesium.js源码中&#xff0c; 某些类或方法的注释中含有private这个“私有”标识 会导致不会在API文档中显示 &#xff08;这是jsdoc的规范&#xff09; 解决方法&#xff1a; Ceisum.js 1.110.0版本的解决方案&#xff1a; 在gulpfile.js中的buildDocs方法中&#xff0…

vscode Coder Runner 运行C++

1. 设置Code Runner 2. 防止输入读不到&#xff0c;把在终端运行勾上。 3. 设置minw/bin的环境变量 安装mingw教程&#xff1a;https://blog.csdn.net/fancy_male/article/details/133992000 4. 见图

ArGIS Engine专题(15)之GP模型在地图服务与地图服务之间实现叠置分析

前一篇文章已经介绍过导入要素范围与地图服务的叠加分析,相当于单要素与多要素之间的分析,这篇文章介绍地图服务与地图服务之间的叠加分析,即是多要素有多要素之间的相交分析,功能基本类似。 一、结果预览 二、需求简介 以下是一些常见的业务场景: (1)空间规划和土地…

淘宝商品详情API接口(H5端和APP端),淘宝详情页,商品属性接口,商品信息查询

一、接口参数说明&#xff1a;提取淘宝商品详情页各项数据&#xff0c;包含skuid、价格、收藏数、加购数、月销售量、主图、标题、详情页图片等页面上可以看奥的数据都可以拿到。 点击获取key和secret 二、使用场景 1、商品销售情况分析&#xff0c;根据销量调整活动方案&am…

【linux系统】如何在服务器上安装Anaconda

文章目录 1. 安装Anconda1.1. 下载Anaconda安装包1.2. 安装Anaconda1.2.1. 点击回车&#xff08;Enter&#xff09;1.2.2. 添加环境变量1.2.3. 激活环境变量 1.3. 检查是否安装成功 2. Anaconda安装pytorch2.1. 创建虚拟环境2.2. 激活(进入)虚拟环境2.3. 安装pytorch 1. 安装An…