GO之流程控制

一、流程控制简述

一)流程控制的作用

  流程控制语句是用来控制程序中语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑块

二)流程控制的分类

  控制语句分为三类:顺序、选择和循环

  • 顺序结构:依次执行:先执行a,再执行b的逻辑
  • 条件判断结构:若...,则...的逻辑
  • 循环结构:若...,则继续...的逻辑

  这三种基本逻辑是相互支撑的,他们构成了算法基本机构,无论怎样复杂的逻辑结构,都可以通过他们来表达。所以任何一种高级语言都要局部上述两种结构。

三)流程控制的流程

  

二、详解流程控制语句

一)分支结构

  1、if分支
  • 表达式左右的 () 是建议省略的
  • if 后面可以并列加入变量的定义的 使用分号 隔开 : if count := 10; count < 30 { }

  单分支

复制代码
if 条件表达式 {
  逻辑代码
}

  双分支

复制代码
if 条件表达式 {
  逻辑代码
} 
else {
  逻辑代码
}

  多分支

复制代码
if 条件表达式1 {
  逻辑代码1
} else if 条件表达式2 {
  逻辑代码2
}
......

else {
  逻辑代码n
}
  2、switch分支

  基本语法

复制代码
switch 表达式 {
  case 值1, 值2, .....:
    语块1  
  case 值3, 值4, .....:
    语块2
  ......
  default:
    语句n
}

  注意事项

  • switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
  • case后的各个值的数据类型,必须和switch的表达式数据类型一致
  • case后可以带多个表达式,使用逗号间隔。例: case 表达式1, 表达式2, ....
  • case后的表达式若是常量值(字面值),则要求不能重复
  • case 后面不需要带break,程序匹配case后就会执行对应的代码块,然后退出switch,若一个都匹配不到,则执行default
  • default分支不是必须的
  • default分支可以放在任何位置,不一定非放到最后
  • switch后也可以不带表达式,当做if分支来使用

  

  • switch后也可以直接声明和定义一个变量,分号结束(不推荐)

  

  

  • switch穿透,利用fallthrough 关键字,若在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透

二)循环结构

  1、for循环
    1)一般语法结构
复制代码
for (初始化表达式; 布尔表达式; 迭代因子) {
  循环体;
}
  • 初始化部分设置循环变量的初值
  • 条件判断部分为任意布尔表达式
  • 迭代因子控制循环变量的增减
  • for的出事表达式,不能用var定义变量的形式,要用 :=
复制代码
package main

import "fmt"

func main() {
    var sum int = 0
    /*
        for 初始表达式; 布尔表达式; 迭代因子 {
            循环体
        }
    */
    for i := 0; i < 100; i++ {
        sum += i
    }

    fmt.Println("100之内整数求和sum:", sum)
}
    2)for range

  for range 结构时Golang语言特有的一种迭代结果,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map及通道。

  for range语法上类似于其他语言中的 for each 语句,一般形式为

复制代码
for key, val := range coll {
  ...
} 

  范例

复制代码
    // 定义一个字符串
    var str string = "hello world! 你好,世界!"
    // 方式一:使用普通for循环:按照字符串的索引进行循环 
    //for i := 0; i < len(str); i++ {
    //    fmt.Printf("%c \n", str[i])
    //}
    //
    // 方式二: 使用 for range
    for i , value := range str {
        fmt.Printf("索引为: %d, 具体的值为:%c \n", i, value)
    }

**  执行结果如下**

复制代码
索引为: 0, 具体的值为:h
索引为: 1, 具体的值为:e
索引为: 2, 具体的值为:l
索引为: 3, 具体的值为:l
索引为: 4, 具体的值为:o
索引为: 5, 具体的值为:
索引为: 6, 具体的值为:w
索引为: 7, 具体的值为:o
索引为: 8, 具体的值为:r
索引为: 9, 具体的值为:l
索引为: 10, 具体的值为:d
索引为: 11, 具体的值为:!
索引为: 14, 具体的值为:
索引为: 15, 具体的值为:你
索引为: 18, 具体的值为:好
索引为: 21, 具体的值为:,
索引为: 24, 具体的值为:世
索引为: 27, 具体的值为:界
索引为: 30, 具体的值为:!

**  总结:**

  • 普通for循环,无法将中文正常输出
  • for range,会将中文正常输出
  2、关键字

  break

  • switch语句中,每个case分支后都用break结束当前分支,但是在go中break可以省略(不写)
  • break可以结束正在执行的循环:结束离它最近的循环
  • 标签的使用:若定义的标签没有使用到的话,那么标签不用加,否则标错(标签定义未使用)

  continue

  • 结束本地循环,继续下一次循环

  goto

  • 作用:可以无条件地转移到程序的指定的行
  • 使用场景:通常与条件语句配合使用,可用来实现条件转移
  • 在go程序设计时,一般不建议使用goto语句,以免造成程序流程的混乱

  return

  • 结束当前函数(方法)
相关推荐
Kendra91911 分钟前
运维监控平台(Prometheus + Grafana)部署与维护
运维·grafana·prometheus
分布式存储与RustFS12 分钟前
指标、日志、链路进同一个桶:GreptimeDB 存算分离解读与 RustFS 接入配置
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
临床数据科学和人工智能兴趣组13 分钟前
在R语言的生态系统中,字符串处理一直是一个重要且复杂的任务
开发语言·正则表达式·r语言·r语言-4.2.1
蜗牛互联网14 分钟前
Python调用Gemini Structured Outputs实现工单路由门禁
java·开发语言·人工智能·python
SEO_juper30 分钟前
给网页做可引用性评分:判断内容够不够让 AI 引用(GEO 工具,附代码)
开发语言·人工智能·爬虫·python·seo·独立站
橙色云-智橙协同研发33 分钟前
电子高科技行业:机械与电子(MCAD & ECAD)如何协同?
大数据·运维·服务器·人工智能·安全
Wang's Blog34 分钟前
Java 项目实战: 交友项目 - 产品定位、功能模块与客户端原型解读
java·开发语言·交友
小此方43 分钟前
Linux网络(二十三):图文详解子网划分、分类划分的本质
linux·运维·网络
zoutao981 小时前
DeepSeek 智能效果实测与能力边界解析
大数据·运维·人工智能
wdfk_prog1 小时前
LWIP教程 16:从 MTU 到 `ip4_frag()` / `ip4_reass()`——IPv4 分片、重组、超时与内存压力
运维·服务器·网络·笔记·学习