当前位置: 首页 > 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
}
http://www.lryc.cn/news/447735.html

相关文章:

  • 无人机在救灾方面的应用!
  • 面试知识点总结篇一
  • 【计算机网络 - 基础问题】每日 3 题(二十五)
  • 【第十八章:Sentosa_DSML社区版-机器学习之协同过滤】
  • TDOA方法求二维坐标的MATLAB代码演示与讲解
  • 基于微信的原创音乐小程序的设计与实现+ssm论文源码调试讲解
  • 基于大数据技术的颈椎病预防交流与数据分析及可视化系统
  • Spring MVC中实现一个文件上传和下载功能
  • Webpack 介绍
  • 在Linux实时监控某个应用是否运行,未运行,执行运行命令
  • Serilog文档翻译系列(六) - 可用的接收器、增强器、格式化输出
  • 傅里叶级数在机器人中的应用(动力学参数辨识)
  • 前端框架Vue、React、Angular、Svelte对比
  • 深度学习后门攻击分析与实现(二)
  • boost 的lockfree 使用
  • 基于Hexo个人博客界面优化
  • vue3+ts不能将类型“Timeout”分配给类型“null”不能将类型“Timeout”分配给类型number
  • 如何给多台Linux机器设置时间同步
  • 忘写return有什么现象?
  • 大数据新视界 --大数据大厂之 Druid 实时数据分析平台在大数据中的应用
  • MySQL --基本查询(下)
  • vue3实现自定义主题色切换功能
  • 不懂性能测试,被面试官挂了...
  • JS逆向基础-谷歌浏览器调试技巧(详细)
  • 那年我双手插兜,使用IPv6+DDNS动态域名解析访问NAS
  • CSS的弹性盒子模型(Flex box)
  • django drf 分页器
  • SpringBoot整合JPA实现CRUD详解
  • 干部画像——精准辅助干部选拔的核心利器
  • linux网络编程9