Go语言流程控制

Go语言流程控制

1.IF-ELSE

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

go 复制代码
if 布尔表达式 {
   /* 在布尔表达式为 true 时执行 */
}

例如:

go 复制代码
package main

import "fmt"

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

2.Switch-Case

switch 语句

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

go 复制代码
switch var1 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

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

例如:

go 复制代码
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 语法格式如下:

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

例如:

go 复制代码
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("未知型")    
   }  
}

以上代码执行结果为:

plain 复制代码
x 的类型 :<nil>

3.select 语句

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

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

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

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

go 复制代码
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将执行输出报错信息:

go 复制代码
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 的数字之和++

go 复制代码
package main

import "fmt"

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

++2、无限循环++

go 复制代码
package main

import "fmt"

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

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

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

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

go 复制代码
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 自相加后的值++

go 复制代码
package main

import "fmt"

func main() {
    sum := 1
    for sum <= 10 {
        sum += sum
    }
    fmt.Println(sum)  // 16
}
相关推荐
SuniaWang6 分钟前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长9 分钟前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji341613 分钟前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
88号技师16 分钟前
2026年3月中科院一区SCI-贝塞尔曲线优化算法Bezier curve-based optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
t1987512816 分钟前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
m0_726965981 小时前
面面面,面面(1)
java·开发语言
2401_831920741 小时前
分布式系统安全通信
开发语言·c++·算法
代码栈上的思考1 小时前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
~无忧花开~1 小时前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
程序员小假2 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端