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
}
相关推荐
谪仙123几秒前
Spring Data Rest 远程命令执行命令(CVE-2017-8046)
java·后端·spring
笨笨D幸福15 分钟前
Rust 全局变量的最佳实践 lazy_static/OnceLock/Mutex/RwLock
开发语言·算法·rust
打鱼又晒网23 分钟前
linux信号| 学习信号三步走 | 学习信号需要打通哪些知识脉络?
linux·服务器·后端·操作系统
西瓜本瓜@24 分钟前
在Android开发中可以用到的Ui控件有哪些?
android·java·开发语言·ui·android studio·kt
编程点滴35 分钟前
将 Go 作为脚本语言用及一些好用的包
开发语言·后端·golang
世界尽头与你1 小时前
Go语言语法基础
开发语言·后端·golang
波罗学1 小时前
使用 Python 绘制 BTC 期权的波动率曲面
开发语言·python·区块链
2401_872514971 小时前
HTTP代理域名解析的先后顺序:深入解析
开发语言·网络·网络协议·tcp/ip·http·php
Q_hd1 小时前
【Java】Java开发全攻略:从环境搭建到高效编程
java·开发语言