通过select方式并发访问
package main
import (
"fmt"
"time"
)
func GetVec1(result chan map[int]int) {
map1 := make(map[int]int)
map1[1] = 1
time.Sleep(10 * time.Second)
result <- map1
}
func GetVec2(result chan map[int]int) {
// map2 := make(map[int]int)
// map2[2] = 2
result <- nil
}
func main() {
resultchan1 := make(chan map[int]int)
resultchan2 := make(chan map[int]int)
go GetVec1(resultchan1)
go GetVec2(resultchan2)
//
for i := 0; i < 2; i++ {
select {
case result1, ok := <-resultchan1:
//fmt.Println("result1:", result1, ok)
case result2, ok := <-resultchan2:
//fmt.Println("result2:", result2, ok)
}
}
fmt.Println("end")
}
也可以不采用for循环的方式等待,而是调用两次select
select {
case result1, ok := <-resultchan1:
fmt.Println("result1:", result1, ok)
}
select {
case result2, ok := <-resultchan2:
fmt.Println("result2:", result2, ok)
}
两种方式区别:
第一种如果添加超时的话,只需要在select中添加一处
第二种如果添加超时的话,需要在每个select中都添加,共添加两处
如果不加超时的话,两种方式耗时应该是一样的。