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

Go语言流程控制

Go语言流程控制

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

1.IF-ELSE

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

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

例如:

package main

import "fmt"

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

2.Switch-Case

switch 语句

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

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

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

例如:

package main

import "fmt"

func main() {
    var marks int = 90
    switch 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 main

import "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 main

import (
	"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 main

import "fmt"

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

2、无限循环

package main

import "fmt"

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

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

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

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

package main

import (
    "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 main

import "fmt"

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

http://www.kler.cn/a/323901.html

相关文章:

  • mybatisPlus打印sql配置
  • springboot 文件高效上传
  • 浅谈React的虚拟DOM
  • shell编程之变量与引用
  • 麒麟kysec安全
  • 缓存cache
  • “AI+Security”系列第3期(四):360安全大模型业务实践
  • 一文上手Kafka【中】
  • 叉车高位显示器无线摄影,安装更加便捷!
  • 从“纸面算力”到“好用算力”,超聚变打通AI+“最后一公里”
  • RabbitMQ高级特性-重试机制
  • 备考中考的制胜法宝 —— 全国历年中考真题试卷大全
  • 【C++笔记】初始模版和STL简介
  • Python项目周报
  • ChatGPT 提取文档内容,高效制作PPT、论文
  • vue2 页面强制渲染
  • 计算机毕业设计电影票购买网站 在线选票选座 场次订票统计 新闻留言搜索/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
  • 【C++拓展(四)】秋招建议与心得
  • QEMU 用户网络与桥接网络设置总结
  • ubuntu22.04磁盘挂载(多磁盘和单磁盘挂载)
  • 讯飞星火编排创建智能体学习(一)最简单的智能体构建
  • 什么是触发器(Trigger)?触发器何时会被触发?
  • MYSQL(学习笔记)
  • K8s flink-operator 例子
  • [大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作
  • k8s中,服务的自动注册、自动感知、负载均衡,三个功能的含义及测试验证