Go语言流程控制
- 1.IF-ELSE
- 2.Switch-Case
-
- [switch 语句](#switch 语句)
- [Type Switch](#Type Switch)
- [3.select 语句](#3.select 语句)
- 4.循环语句
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
}