golang并发编程之select|青训营

82 阅读1分钟

Golang中的并发是函数相互运行的能力。Goroutines是开发运行的函数。Golang提供了Goroutines作为并发处理操作的一种方式。 创建一个协程非常简单,就是在一个任务函数前面添加一个go关键字: 实例:

package main

import (
	"fmt"
	"time"
)

func show(msg string) {
	for i := 1; i < 5; i++ {
		fmt.Printf("msg: %v\n", msg)
		time.Sleep(time.Millisecond * 100)
	}
}

func main() {
	go show("C++")
	show("Golang") // 在main协程中执行,如果它前面也添加go,程序没有输出
	fmt.Println("end...")
}

select

1.select是Go中的一个控制结构,类似于 switch 语句,用于处理异步IO操作。select 会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态 (即能读写) 时,将会触发相应的动作 select中的case语句必须是一个channel操作作 select中的default子句总是可运行的

2.如果有多个 case 都可以运行, select 会随机公平地选出一个执行,其他不会执行.

3.如果没有可运行的 case 语句,且有 default 语句,那么就会执行 default 的动作

4.如果没有可运行的 case 语句,且没有 defaut 语句,select 将阻塞,直到某个 case 通信可以运行

实例

package main

import (
	"fmt"
	"time"
)

var chanInt = make(chan int)
var chanStr = make(chan string)

func main() {

	go func() {
		chanInt <- 100
		chanStr <- "hello"
		close(chanInt)
		close(chanStr)
	}()

	for {
		select {
		case r := <-chanInt:
			fmt.Printf("chanInt: %v\n", r)
		case r := <-chanStr:
			fmt.Printf("chanStr: %v\n", r)
		default:
			fmt.Println("default...")
		}
		time.Sleep(time.Second)
	}
}