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
}
相关推荐
kingwebo'sZone1 小时前
ASP.net WebAPI 上传图片实例(保存显示随机文件名)
后端·asp.net
桑榆肖物1 小时前
一个简单的ASP.NET 一致性返回工具库
后端·asp.net
羚羊角uou4 小时前
【C++】list模拟实现(详解)
开发语言·c++
组态软件4 小时前
web组态软件
前端·后端·物联网·编辑器·html
Peter_chq4 小时前
【计算机网络】多路转接之select
linux·c语言·开发语言·网络·c++·后端·select
MelonTe5 小时前
Golang网络模型netpoll源码解析
golang
cnsxjean7 小时前
SpringBoot集成Minio实现上传凭证、分片上传、秒传和断点续传
java·前端·spring boot·分布式·后端·中间件·架构
CRMEB-嘉嘉7 小时前
如何优化 PHP 性能?
开发语言·php
hadage2337 小时前
--- stream 数据流 java ---
java·开发语言