Go流程控制代码详解

作者:教练我写不出来 时间:2023-09-01 10:21:12 

Go流程控制

1、条件语句IF

1、简单格式(不支持三目运算符)
if 布尔表达式 {
 // 执行语句
}
2、if里面包含多个表达式的时候,使用‘;'隔开

2、条件语句switch

1、var1可以是任何类型,value1和value2可以是同类型的人和值
switch var1 {
 case value1:
 xxx
 case value2:
 xxx
 default:
 yyy
}

1、Type Switch

switch还可以被用于type-switch来判断某个interface变量中实际存储的变量类型

switch x.(type) {
 case type:
 statement(s)
 case type:
 statement(s)
 default:
 statement(s)
}

3、条件语句select

select语句类似switch语句,但select会随机执行一个可运行的case,如果没有case可运行,它将阻塞,直到有case可运行。

select {
case communication clause :
 statement(s)
 case communication clause :
 statement(s)
 default:
 statement(s)
}

// 解释:每个case必须是一个通信,所有的channel表达式都会被求值,所有被发送的表达式都会被求值,
// 1、如果任意某个通信可以执行,就执行,其余忽略
// 2、如果有多个case可以执行,select随机且公平的选出一个执行
// 3、否则:如果有default语句,执行;没有default,select将阻塞,直到某个通信可以运行,Go不会重新对Channel或值进行求职

1、golang select的使用以及典型用法

1、基本使用:

用于处理异步IO操作,select会监听case语句中的channel的读写操作,当case中channel读写操作为非阻塞状态,将触发相应的动作。(case语句必须是channel操作)

2、典型用法:

1)超时判断

//比如在下面的场景中,使用全局resChan来接受response,如果时间超过3S,resChan中还没有数据返回,则第二条case将执行
var resChan = make(chan int)
// do request
func test() {
   select {
   case data := <-resChan:
       doData(data)
   case <-time.After(time.Second * 3):
       fmt.Println("request time out")
   }
}

func doData(data int) {
   //...
}

2)退出

//主线程(协程)中如下:
var shouldQuit=make(chan struct{})
fun main(){
   {
       //loop
   }
   //...out of the loop
   select {
       case <-c.shouldQuit:
           cleanUp()
           return
       default:
       }
   //...
}

//再另外一个协程中,如果运行遇到非法操作或不可处理的错误,就向shouldQuit发送数据通知程序停止运行
close(shouldQuit)

3)判断channel是否阻塞

//在某些情况下是存在不希望channel缓存满了的需求的,可以用如下方法判断
ch := make (chan int, 5)
//...
data:=0
select {
case ch <- data:
default:
   //做相应操作,比如丢弃data。视需求而定
}

4、循环语句for

for init; condition; post {}
for condition {}
for {}

// 解释:1)init一般为赋值表达式,给控制变量赋初始值;2)condition:关系表达式或逻辑表达式,循环控制条件;3)post:一般为赋值表达式,给控制变量增量或减量
// 执行流程:判别赋值表达式init是否满足condition给定的条件,若为真,则执行循环语句,然后执行post,进入第二轮循环

5、循环语句range

for key, value := range oldMap {
 newMap[key] = value
}

for 和 for range 有什么区别?

1、使用场景:

1)for可以遍历array、slice、key为整形递增的map、string

2)for range 可以完成for所有事情,却能做for不能做的事情,包括遍历key为string类型的map、遍历channel

 6、循环控制goto、break、&hellip;

Goto、Break、Continue
1、三个语句都可以配合标签(label)使用
2、标签名区分大小写,定义后若不是用会造成编译错误
3、continue、break配合标签(label)可以用于多层循环跳出
4、goto调整执行位置,与continue、break配合标签(label)的结果并不相同

来源:https://blog.csdn.net/qq_45151059/article/details/130241523

标签:Go,流程控制
0
投稿

猜你喜欢

  • np.zeros()函数的使用方法

    2023-11-10 06:33:36
  • Python通过poll实现异步IO的方法

    2023-07-17 04:08:52
  • python路径的写法及目录的获取方式

    2023-10-22 09:26:57
  • python3 cookbook中常遇问题解答

    2022-09-07 09:07:05
  • Python实现自动化域名批量解析分享

    2023-01-27 00:04:36
  • python入门之算法学习

    2021-05-16 19:38:19
  • Python基于文件内容实现查找文件功能

    2022-04-13 11:17:47
  • macOS安装Solr并索引MySQL

    2024-01-17 13:57:08
  • 深入浅析Python 命令行模块 Click

    2022-12-13 19:41:40
  • SQLServer与服务器连接时出错的解决方案

    2009-06-28 14:35:00
  • Go素数筛选分析详解

    2023-07-22 11:50:02
  • MySQL创建全文索引分享

    2024-01-21 10:16:06
  • Pytorch dataloader在加载最后一个batch时卡死的解决

    2022-09-15 06:50:34
  • XML编程实例: ASP+XML打造留言本

    2008-10-25 16:35:00
  • Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)

    2023-01-20 02:42:35
  • 利用Python编写一个简单的缓存系统

    2021-08-15 02:55:39
  • 关于程序员生活的一份调查,看看你属于哪一个群体吧

    2022-08-11 16:00:48
  • Go语言执行系统命令行命令的方法

    2024-04-27 15:38:29
  • 20个优秀网站助你征服CSS[译]

    2008-09-21 13:21:00
  • 在vue中使用防抖和节流,防止重复点击或重复上拉加载实例

    2024-05-22 10:28:01
  • asp之家 网络编程 m.aspxhome.com