Go语言流程控制(一)

分支结构

if...else...语句

Go 语言中的 if...else 语句是一种基本的流程控制结构,用于根据条件执行不同的代码块。下面是关于 Go 语言中 if...else 语句的详细介绍:

基本语法

if 条件表达式 {// 当条件表达式为 true 时执行的代码
} else {// 当条件表达式为 false 时执行的代码
}

用法

1.基本的 if 语句

if score > 60 {fmt.Println("Pass")
}

2.if...else...语句

var ten int = 11
if ten > 10 {fmt.Println(">10")
} else {fmt.Println("<=10")
}

3.if...else if...else 链 

if score >= 90 {fmt.Println("Excellent")
} else if score >= 60 {fmt.Println("Pass")
} else {fmt.Println("Fail")
}

特殊写法

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

if num, err := someFunction(); err == nil {fmt.Println(num)
} else {fmt.Println(err)
}

这段代码是Go语言中一个非常典型的模式,用于处理那些可能会返回错误的情景,比如读取文件、网络操作或调用某些可能失败的函数。我来详细解释一下每一部分:

  1. 函数调用与同时声明变量:

    1num, err := someFunction()

    这一行做了两件事:

    • 调用了 someFunction() 函数。
    • 使用简短声明 := 同时声明了两个变量 num 和 err,并分别赋予了 someFunction() 返回的两个值。在Go中,一个函数可以返回多个值,这里假设 someFunction() 返回一个需要的数据(例如一个整数、字符串等,用 num 接收)和一个错误对象(用 err 接收)。如果函数执行成功,通常会返回 nil 作为错误值。
  2. 条件判断:

    if err == nil {

    这个条件检查 err 是否为 nil。在Go中,nil 表示没有错误,所以如果 err == nil 为真,意味着 someFunction() 调用成功。

  3. 成功分支:

    fmt.Println(num)

    如果没有错误(即 err == nil),就打印出成功获取到的数据 num

  4. 失败分支:

    else {fmt.Println(err)
    }

    如果有错误(即 err != nil),则执行这里的代码块,打印出错误信息。这样可以快速定位问题所在。

循环结构

for语句

for 循环的几种主要形式:

1.经典C风格的for循环:

for 初始化; 条件; 更新 {// 循环体
}

这种形式类似于C语言的for循环,其中:

  • 初始化:在循环开始之前执行一次,通常用于设置循环控制变量。
  • 条件:在每次循环迭代前检查,如果为 true 则执行循环体。
  • 更新:在每次循环体执行完毕后执行,通常用于改变循环控制变量。

用法

sum := 0
for i := 0; i < 10; i++ {sum += i
}

2.条件循环:

for 条件 {// 循环体
}

这种形式省略了初始化和更新部分,仅当给定的条件为 true 时执行循环体,相当于没有初始化和更新的简化版。

用法

var i int
for i <= 10 {i++
}

3.无限循环:

for {// 循环体
}

这种形式没有条件检查,因此会一直循环下去,除非在循环体内使用 break 语句跳出循环。

用法

var i int
for {if i > 10 {break}i++
}
for j := 0; j < 5; j++ {for i := 0; i < 10; i++ {if i > 5 {break JLoop}fmt.Println(i)}
}
JLoop:
// ...

上述代码中,break 语句终止的是 JLoop 标签处的外层循环。

4.for 中的初始语句——开始循环时执行的语句

初始语句是在第一次循环前执行的语句,一般使用初始语句执行变量初始化,如果变量在此处被声明,其作用域将被局限在这个 for 的范围内。

初始语句可以被忽略,但是初始语句之后的分号必须要写,代码如下:

step := 2
for ; step > 0; step-- {fmt.Println(step)
}
这段代码将 step 放在 for 的前面进行初始化,for 中没有初始语句,此时 step 的作用域就比在初始语句中声明 step 要大。

5.for 中的条件表达式——控制是否循环的开关

每次循环开始前都会计算条件表达式,如果表达式为 true,则循环继续,否则结束循环,条件表达式可以被忽略,忽略条件表达式后默认形成无限循环。

结束循环时带可执行语句的无限循环

下面代码忽略条件表达式,但是保留结束语句,代码如下:

var i int
for ; ; i++ {if i > 10 {break}
}

上面的代码还可以改写为更美观的写法,代码如下:

var i int
for {if i > 10 {break}i++
}

练习题:打印九九乘法表

package main
import "fmt"
func main() {// 遍历, 决定处理第几行for y := 1; y <= 9; y++ {// 遍历, 决定这一行有多少列for x := 1; x <= y; x++ {fmt.Printf("%d*%d=%d ", x, y, x*y)}// 手动生成回车fmt.Println()}
}

键值循环

在Go语言中,for循环有一种特殊形式,称为“键值循环”(key-value iteration),常用于遍历数组、切片、映射(map)、通道(channel)等集合类型,特别是当需要同时访问元素的索引或键以及对应的值时。这种循环形式使用关键字range

基本语法

for index, value := range collection {// 循环体
}

其中:

  • index:表示集合中当前元素的索引或映射中键的副本。
  • value:表示集合中当前元素的值或映射中对应键的值的副本。
  • collection:是要遍历的集合,可以是数组、切片、映射或通道。

遍历数组/切片

示例1:遍历切片
package mainimport "fmt"func main() {fruits := []string{"apple", "banana", "cherry"}for i, fruit := range fruits {fmt.Printf("Index: %d, Fruit: %s\n", i, fruit)}
}

这段代码会输出每个元素的索引和值。

示例2:忽略索引

如果你不关心索引,可以使用下划线 _ 忽略它。

for _, fruit := range fruits {fmt.Println(fruit)
}

遍历映射(map)

示例3:遍历映射
package mainimport "fmt"func main() {ages := map[string]int{"Alice": 30, "Bob": 25, "Charlie": 35}for name, age := range ages {fmt.Printf("%s is %d years old.\n", name, age)}
}

这里,name 是键,age 是值。

示例4:仅遍历映射的键或值

如果你想只获取映射的键或值,可以再次使用下划线 _

for name := range ages {fmt.Println(name)
}
// 或
for _, age := range ages {fmt.Println(age)
}

遍历通道

示例5:遍历通道
package mainimport ("fmt""time"
)func main() {ch := make(chan int)go func() {for i := 0; i < 5; i++ {ch <- itime.Sleep(time.Second)}close(ch)}()for v := range ch {fmt.Println("Received:", v)}
}

在这个例子中,range 用于从通道接收值,直到通道被关闭。

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

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

相关文章

零基础代码随想录【Day27】|| 39. 组合总和,40.组合总和II, 131.分割回文串

目录 DAY27 39. 组合总和 解题思路&代码 40.组合总和II 解题思路&代码 131.分割回文串 解题思路&代码 DAY27 39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有…

MySQL日志机制【undo log、redo log、binlog 】

前言 SQL执行流程图文分析&#xff1a;从连接到执行的全貌_一条 sql 执行的全流程?-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞20次&#xff0c;收藏12次。本文探讨 MySQL 执行一条 SQL 查询语句的详细流程&#xff0c;从连接器开始&#xff0c;逐步介绍了查询缓存、解析 S…

Prompt提示词教程 | 提示工程指南 | 提示词示例 入门篇

在上一节中&#xff0c;我们介绍并给出了如何赋能大语言模型的基本示例。如果还没看而且是刚入门的同学建议看下&#xff0c;有个基本概念。 Prompt提示词教程 | 提示工程指南 | 提示工程简介https://blog.csdn.net/HRG520JN/article/details/138523705在本节中&#xff0c;我…

基于springboot+vue+Mysql的教师人事档案管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Ansible自动化运维工具---Playbook

一、playbook playbook是剧本的意思 通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。 playbook本身由以下各部分组成&#xff1a; Tasks: 任务&#xff0c;即调用模块完成的某操作Variables: 变量Templates: 模板Handlers: 处理器&#xff0c;当某条…

力扣刷题--数组--第二天

今天仍然做二分查找相关的题目。先来回顾一下二分查找的方法和使用的条件。二分查找是在数组中查找目标值的一种方法&#xff0c;通过边界索引确定中间索引&#xff0c;判断中间索引处的元素值和目标值的大小&#xff0c;来不断缩小查找区间。使用二分查找有如下一些限制&#…

深度剖析muduo网络库1.1---面试提问(阻塞、非阻塞、同步、异步)

在面试过程中&#xff0c;如果被问到关于IO的阻塞、非阻塞、同步、异步时&#xff0c;我们应该如何回答呢&#xff1f; 结合最近学习的课程&#xff0c;我作出了以下的总结&#xff0c;希望能与大家共同探讨&#xff01; 先给出 陈硕大神原话&#xff1a;在处理IO的时候&…

Macbook Pro 2017 安装 Sonoma 简述版(带问题解决操作)

详细原因已经写在之前的记录中了&#xff0c;可转去查看&#xff1a; 记录Macbook Pro 2017 使用Opencore安装sonoma_macbookpro2017升级sonoma-CSDN博客 下面是最近整理可用的方法简述版本&#xff0c;只记录安装要点&#xff0c;最后说明一下不按步骤安装可能会出现的问题。…

【Hugging Face】编写 shell 脚本在 huggingface 镜像站快速下载模型文件

前言 我们使用 Git LFS 和 wget 结合的方法&#xff0c;小文件使用 Git 下载&#xff0c;大文件使用 wget 下载 Git 下载的优缺点&#xff1a; 优点&#xff1a;相当简单 缺点&#xff1a;不支持断点续传 直接 wegt 下载比较稳定&#xff0c;但是欠缺优雅 我们可以将这两…

GaussianTalker 学习笔记

目录 巴塞尔面部模型 01_MorphableModel.mat 下载地址: 数据准备转换BFM 缺少diff_gaussian_rasterization.py

Backblaze发布2024 Q1硬盘故障质量报告-2

截至2024年第一季度末&#xff0c;我们正在跟踪279,572块正在运行的硬盘。硬盘型号在2024年第一季度末必须拥有500块或更多的硬盘&#xff0c;并在整个使用寿命期间累积超过100,000个硬盘工作日&#xff0c;达到这个条件的所有型号盘的故障率趋势表现如下&#xff1a; 除了三种…

JAVA两个线程交替打印实现

方案1 Semaphore 机制 通过信息号机制来 协调两个线程&#xff0c;一个线程打印后&#xff0c;给另一个线程释放一个信号量 Semaphore semaphorea new Semaphore(1);Semaphore semaphoreb new Semaphore(0);Thread threada new Thread(new Runnable() {Overridepublic void…

11.Netty简单认识

介绍 Netty是一个异步的&#xff0c;基于事件驱动&#xff08;采用多路复用技术Selector&#xff09;的网络应用框架。用于快速开发可维护、高性能的网络服务器和客户端。 IO事件发生时才会进行相应的处理。可连接&#xff0c;可读&#xff0c;可写事件。 Netty的异步 这里…

W801学习笔记十八:古诗学习应用——中

现在我们加入交互逻辑——对用户选择的判断。 1、定义游戏的相关变量&#xff0c;如记录正确和错误的数量&#xff0c;运行时间等等。这些都可以作为游戏应用的私有属性。 u8 isFinished0;u16 correntCount 0;u16 wrongCount 0;u32 totalTime0; 2、处理交互。 根据前边定义…

python画折线图(一图多线)

python画折线图&#xff08;一图多线&#xff09; import matplotlib.pyplot as plt import seaborn as snsx ["0cm", "10cm", "20cm", "30cm", "40cm", "50cm", "60cm"] //x轴 RBF [] //Y轴对应的数…

20240430,类模板案例-数组类封装,STL初识,STRING容器(构造函数,赋值)

我真的碎掉了&#xff0c;主要是我很缺那点钱啊现在&#xff0c;我真的碎掉了我碎掉了碎掉了碎掉了 目录 0.8 类模板案例-数组类封装 myarray.hpp a.cpp 一&#xff0c;STL初识 1.1 STL基本概念 1.2 vector 存放内置数据 1.3 vector存放自定义数据(及指针类型&#xf…

JavaScript逆向技术

JavaScript逆向之旅&#xff1a;深入解析与实践 在数字时代&#xff0c;前端技术的迅速发展使得Web应用变得更加丰富和复杂。JavaScript&#xff0c;作为前端的核心语言&#xff0c;其安全性和隐私保护问题也逐渐浮出水面。JavaScript逆向&#xff0c;作为一种从前端代码中提取…

ros安装cartographer

安装 当然是先去看cartograpger官方文档了&#xff0c;照着说明一步步下来。 执行以下语句会报错&#xff0c; wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall wstool update -t src参看…

c/c++:山顶元素

题目描述(题目链接) 从键盘输入一个整型二维数组&#xff0c;遍历二维数组中的每个元素&#xff0c;如果此元素比其上下左右的数字都大&#xff0c;即为山顶元素。 输入格式 一个≥1的整数&#xff0c;表名是几行几列的二维数组&#xff0c;一个整型二维数组&#xff0c;数据…

【数学】矩阵与矩阵乘法

矩阵 定义一个 n m n\times m nm 的矩阵如下&#xff1a; [ a 1 , 1 ⋯ a 1 , m ⋮ ⋱ ⋮ a n , 1 ⋯ a n , m ] \begin{bmatrix}a_{1,1}&\cdots&a_{1,m}\\\vdots&\ddots&\vdots\\a_{n,1}&\cdots&a_{n,m}\end{bmatrix} ​a1,1​⋮an,1​​⋯⋱⋯​…