当前位置: 首页 > news >正文

Go语言流程控制

Go语言流程控制

  • 1.IF-ELSE
  • 2.Switch-Case
    • switch 语句
    • Type Switch
  • 3.select 语句
  • 4.循环语句

1.IF-ELSE

Go 编程语言中 if 语句的语法如下:

if 布尔表达式 {/* 在布尔表达式为 true 时执行 */
}

例如:

package mainimport "fmt"func main() {var a int = 521if a == 521 {fmt.Println("我爱你")} else {fmt.Println("我不爱你")}
}

2.Switch-Case

switch 语句

Go 编程语言中 switch 语句的语法如下:

switch var1 {case val1:...case val2:...default:...
}

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不被局限于常量或整数,但必须是相同的类型;或者最终结果为相同类型的表达式。

例如:

package mainimport "fmt"func main() {var marks int = 90switch marks {case 90:fmt.Println("优秀")case 80:fmt.Println("良好")case 60:fmt.Println("及格")}
}

Type Switch

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

Type Switch 语法格式如下:

switch x.(type){case type:statement(s);      case type:statement(s); /* 你可以定义任意个数的case */default: /* 可选 */statement(s);
}

例如:

package mainimport "fmt"func main() {var x interface{}switch i := x.(type) {case nil:  fmt.Printf(" x 的类型 :%T",i)                case int:  fmt.Printf("x 是 int 型")                      case float64:fmt.Printf("x 是 float64 型")          case func(int) float64:fmt.Printf("x 是 func(int) 型")                      case bool, string:fmt.Printf("x 是 bool 或 string 型" )      default:fmt.Printf("未知型")    }  
}

以上代码执行结果为:

x 的类型 :<nil>

3.select 语句

在 Go 语言中,select 语句用于处理多个通道(channel)的通信操作。它的功能类似于 switch 语句,但它专门用于处理异步的通道操作。select 会阻塞,直到其中的某个通道可以进行发送或接收操作。通过 select 语句,Go 可以方便地处理并发任务的多路复用

select 语句会监听所有指定的通道上的操作,一旦其中一个通道准备好就会执行相应的代码块。

如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。

在下面这个示例中,chan1 在 1 秒后发送数据,chan2 在 2 秒后发送数据。select 会阻塞,直到某个通道有数据可接收:

package mainimport ("fmt""time"
)func main() {chan1 := make(chan string)chan2 := make(chan string)go func() {time.Sleep(1 * time.Second)chan1 <- "chan1 done"}()go func() {time.Sleep(2 * time.Second)chan2 <- "chan2 done"}()for i := 0; i < 2; i++ {select {case msg1 := <-chan1:fmt.Println(msg1)case msg2 := <-chan2:fmt.Println(msg2)}}
}

用select实现超时判断机制,在下面的场景中,使用全局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) {//...
}

4.循环语句

for 循环是一个循环控制结构,可以执行指定次数的循环。

1、计算 1 到 10 的数字之和

package mainimport "fmt"func main() {sum := 0for i := 0; i <= 10; i++ {sum += i}fmt.Println(sum)  // 55
}

2、无限循环

package mainimport "fmt"func main() {sum := 0for {sum += 1}fmt.Println(sum)
}

要停止无限循环,可以在命令窗口按下ctrl-c

3、实例3:For-each range 循环

这种格式的循环可以对字符串、数组、切片等进行迭代输出元素。

package mainimport ("fmt"
)func main() {strings := []string{"imustctf", "wode"}for i, s := range strings {fmt.Println(i, s)// 0 imustctf// 1 wode}
}

4、类似的while循环,在 sum 小于 10 的时候计算 sum 自相加后的值

package mainimport "fmt"func main() {sum := 1for sum <= 10 {sum += sum}fmt.Println(sum)  // 16
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • “跨链桥“的危害
  • docker zookeeper集群启动报错:Cannot open channel to * at election address /ip:3888
  • 数据驱动农业——农业中的大数据
  • 【已解决】使用JAVA语言实现递归调用-本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。
  • 通信系统中频偏估计补偿的流程
  • 12. Scenario Analysis for greedy algorithm
  • 使用云服务器构建langchin
  • parameters()函数 --- 获取模型参数量
  • ConcurrentHashMap的使用
  • 如何选择光伏业务监管系统软件
  • 2024.09.18 leetcode 每日一题
  • 排序算法C++
  • AWS EKS 中的负载均衡和 TLS 配置:全面指南
  • Matplotlib-数据可视化详解
  • QT| QT配置CUDA
  • @jsonView过滤属性
  • [笔记] php常见简单功能及函数
  • 2019年如何成为全栈工程师?
  • Codepen 每日精选(2018-3-25)
  • cookie和session
  • Date型的使用
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • HashMap剖析之内部结构
  • JDK 6和JDK 7中的substring()方法
  • MD5加密原理解析及OC版原理实现
  • Redux 中间件分析
  • Ruby 2.x 源代码分析:扩展 概述
  • vuex 笔记整理
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • vue学习系列(二)vue-cli
  • Webpack 4x 之路 ( 四 )
  • 阿里云前端周刊 - 第 26 期
  • 计算机常识 - 收藏集 - 掘金
  • 解决iview多表头动态更改列元素发生的错误
  • 盘点那些不知名却常用的 Git 操作
  • 普通函数和构造函数的区别
  • 网页视频流m3u8/ts视频下载
  • zabbix3.2监控linux磁盘IO
  • 如何用纯 CSS 创作一个货车 loader
  • ​什么是bug?bug的源头在哪里?
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #NOIP 2014# day.1 T2 联合权值
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.each()与$(selector).each()
  • (11)MATLAB PCA+SVM 人脸识别
  • (floyd+补集) poj 3275
  • (MATLAB)第五章-矩阵运算
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (办公)springboot配置aop处理请求.
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十)Flink Table API 和 SQL 基本概念
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)jQuery 基础