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

  • 结束当前函数(方法)
相关推荐
莫名其妙小饼干4 分钟前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
十年一梦实验室13 分钟前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
最爱番茄味22 分钟前
Python实例之函数基础打卡篇
开发语言·python
Karoku06627 分钟前
【k8s集群应用】kubeadm1.20高可用部署(3master)
运维·docker·云原生·容器·kubernetes
木子Linux1 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8241 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
Oneforlove_twoforjob1 小时前
【Java基础面试题033】Java泛型的作用是什么?
java·开发语言
watermelonoops1 小时前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
engchina1 小时前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎