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 main

import "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 main

import "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 main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int)
	go func() {
		for i := 0; i < 5; i++ {
			ch <- i
			time.Sleep(time.Second)
		}
		close(ch)
	}()

	for v := range ch {
		fmt.Println("Received:", v)
	}
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

流畅的python-学习笔记_设计模式+装饰器+闭包

策略模式 类继承abc.ABC即实现抽象类&#xff0c;方法可用abc.abstractmethod装饰&#xff0c;表明为抽象方法 装饰器基础 装饰器实际是语法糖&#xff0c;被装饰的函数实际是装饰器内部返回函数的引用 缺点&#xff1a;装饰器函数覆盖了被装饰函数的__name__和__doc__属性…

Nginx从入门到精通速成

文章目录 一. **Nginx** **的简介**1.1 什么是 **nginx**1.2 正向代理1.3 反向代理1.4 **负载均衡**1.5 动静分离 二. **Nginx** **的安装**三. **Nginx** **的常用的命令**四. **Nginx** **的配置文件**五. **Nginx** **配置实例**反向代理实例**1**5.1 实现效果5.2 准备工作5…

基于51单片机的自动售货机系统

一、项目概述 本文设计了一款以AT89C51单片机为核心的自动售货机系统&#xff0c;并且着重详细地介绍了自动售货机的整体系统设计方案、硬件选择基础、软件使用方法及技巧。 以AT89C51作为CPU处理单元连接各个功能模块&#xff1b;以44矩阵键盘作为输入控制模块对货物进行种类…

论文阅读:RHO-1:Not All Tokens Are What You Need 选择你需要的 Tokens 参与训练

论文链接&#xff1a;https://arxiv.org/abs/2404.07965 以往的语言模型预训练方法对所有训练 token 统一采用 next-token 预测损失。作者认为“并非语料库中的所有 token 对语言模型训练都同样重要”&#xff0c;这是对这一规范的挑战。作者的初步分析深入研究了语言模型的 t…

计算有效声压

计算有效声压 clear all; %%----------------------------------------------读取文件------------------------------------------ % 从wav文件读入语音数据&#xff0c;该语音采样率16k&#xff0c;故信号最高频率8k。 [x,fs]audioread(C2_3_y.wav); % 取x的一个通道 xx(:,1)…

【智能优化算法】海象优化器(Walrus optimizer,WO)

海象优化器(Walrus optimizer&#xff0c;WO)是期刊“EXPERT SYSTEMS WITH APPLICATIONS”&#xff08;中科院一区 IF 8.3&#xff09;的2024年智能优化算法 01.引言 海象优化器(Walrus optimizer&#xff0c;WO)的灵感来自海象通过接收关键信号(危险信号和安全信号)选择迁徙、…

CISAW应急服务:网络安全应急响应之路——从经验到认证的体会

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。作为一名网络安全从业人员&#xff0c;我深知每一次安全事件给组织甚至国家带来的巨大损失和潜在影响。在多年的实际工作中&#xff0c;我积累了一些网络安全应急服务经验&#xff0c;并参加了信息安全保障人员认证&a…

鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务

在鸿蒙的内核线程就是任务&#xff0c;系列篇中说的任务和线程当一个东西去理解. 一般二种场景下需要切换任务上下文: 在线程环境下&#xff0c;从当前线程切换到目标线程&#xff0c;这种方式也称为软切换&#xff0c;能由软件控制的自主式切换.哪些情况下会出现软切换呢? 运…

SSM+Vue+Element-UI实现教资考前指导系统

前言介绍 对于本教资考前指导系统的设计来说&#xff0c;系统开发主要是采用java语言技术&#xff0c;在整个系统的设计中应用MySQL数据库来完成数据存储&#xff0c;具体根据教资考前指导系统的现状来进行开发的&#xff0c;具体根据现实的需求来实现四六级在线考试系统网络化…

KUKA机器人故障报警信息处理(一)

1、KSS00276 机器人参数不等于机器人类型 ①登录专家模式 ②示教器操作&#xff1a;【菜单】—【显示】—【变量】—【单个】 ③名称输入&#xff1a;$ROBTRAFO[] 新值&#xff1a;TRAFONAME[] ④点击【设定值】。 2、电池报警&#xff1a; ①“充电电池警告-发现老化的蓄电池…

洗地机什么牌子最好?618高性价比家用洗地机品牌

随着科技的发展&#xff0c;智能智能清洁家电越来越受到消费者的欢迎。洗地机作为其中的佼佼者&#xff0c;已经成为许多家庭清洁的好帮手。然而&#xff0c;面对满目琳琅的洗地机品牌型号&#xff0c;究竟哪一款机型适合家用呢&#xff0c;正好618也临近了&#xff0c;又有哪些…

【初阶数据结构】单链表之环形链表

目录标题 前言环形链表的约瑟夫问题环形链表环形链表|| 前言 前面我们已经学习了关于单链表的一些基本东西&#xff0c;今天我们来学习单链表的一个拓展——环形链表&#xff0c;我们将用力扣和牛客网上的三道题目来分析讲解环形链表问题。 环形链表的约瑟夫问题 我们首先来看…

【Three.js基础学习】15.scroll-based-animation

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程要点 结合html等场景 做滚动动画 1.遇到的问题&#xff0c; 在向下滚动时&#xff0c;下方会显白&#xff08;部分浏览器&#xff09; 解决&#xff1a;alpha:true …

【网络编程】http协议

预备知识 什么是http协议 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一个应用层的协议&#xff0c;用于在网络中传输超文本&#xff08;如HTML文档&#xff09;。HTTP协议建立在TCP/IP协议之上&#xff0c;是Web浏览器和Web服务器…

「JavaEE」线程安全2:内存可见性问题 wait、notify

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;JavaEE &#x1f387;欢迎点赞收藏加关注哦&#xff01; 内存可见性问题& wait、notify &#x1f349;Java 标准库的线程安全类&#x1f349;内存可见性问题&#x1f34c;volatile 关键字 …

自动化运维管理工具----------Ansible模块详细解读

目录 一、自动化运维工具有哪些&#xff1f; 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …

DirClass

DirClass 通过分析&#xff0c;发现当接收到DirClass远控指令后&#xff0c;样本将返回指定目录的目录信息&#xff0c;返回数据中的远控指令为0x2。 相关代码截图如下&#xff1a; DelDir 通过分析&#xff0c;发现当接收到DelDir远控指令后&#xff0c;样本将删除指定目录…

java入门详细教程——day01

目录 1. Java入门 1.1 Java是什么&#xff1f; 1.2 Java语言的历史 1.3 Java语言的分类 1.4 Java语言的特点 1.4.1 先编译再解释运行 1.4.2 跨平台 1.5 JRE和JDK&#xff08;记忆&#xff09; 1.6 JDK的下载和安装&#xff08;应用&#xff09; 1.6.1 下载 1.6.2 安…

Redis(持久化)

文章目录 1.RDB1.介绍2.RDB执行流程3.持久化配置1.Redis持久化的文件是dbfilename指定的文件2.配置基本介绍1.进入redis配置文件2.搜索dbfilename&#xff0c;此时的dump.rdb就是redis持久化的文件3.搜索dir&#xff0c;每次持久化文件&#xff0c;都会在启动redis的当前目录下…

智能实训-wheeltec小车-抓取(源代码)

语言 :C 源代码&#xff1a; #include <ros/ros.h> #include <image_transport/image_transport.h> #include <cv_bridge/cv_bridge.h> #include <sensor_msgs/image_encodings.h> #include <sensor_msgs/JointState.h> #include <geometry…
最新文章