使用場(chǎng)景
select主要用來(lái)監(jiān)控多個(gè)channel陌宿,channel的數(shù)據(jù)讀取染服,寫(xiě)入懒浮,關(guān)閉等事件,采用的是輪訓(xùn)算法
監(jiān)控事件
channel讀取事件
channel的寫(xiě)入事件
channel關(guān)閉事件
其他default
讀取事件
func addNumberToChan(chanName chan int) {
for {
chanName <- 1
time.Sleep(1 * time.Second)
}
}
// select 監(jiān)控channel的push事件
func testReadChannel() {
var chan1 = make(chan int, 10)
var chan2 = make(chan int, 10)
go addNumberToChan(chan1)
go addNumberToChan(chan2)
for {
select {
case e := <- chan1 :
fmt.Printf("Get element from chan1: %d\n", e)
case e := <- chan2 :
fmt.Printf("Get element from chan2: %d\n", e)
default:
fmt.Printf("No element in chan1 and chan2.\n")
time.Sleep(1 * time.Second)
}
}
}
寫(xiě)入事件
func testAddChannel() {
var chan1 = make(chan int, 10)
var chan2 = make(chan int, 10)
chan1 <- 1
chan2 <- 0
//go addNumberToChan(chan1)
//go addNumberToChan(chan2)
for {
select {
case chan1 <- 1 :
fmt.Printf("Get element from chan1: 1")
case chan2 <- 0 :
fmt.Printf("Get element from chan2: 0")
default:
fmt.Printf("No element in chan1 and chan2.\n")
time.Sleep(1 * time.Second)
}
}
}
PS:注意select語(yǔ)句如果做監(jiān)聽(tīng)使用的話(huà)榄笙,盡量嵌套在for循環(huán)中邪狞,因?yàn)閱为?dú)的select是阻塞的,并且是又返回值的茅撞,eg:
func server1(ch chan string) {
time.Sleep(1 * time.Second)
ch <- "from server1"
}
func server2(ch chan string) {
time.Sleep(1 * time.Second)
ch <- "from server2"
}
func main() {
output1 := make(chan string,1)
output2 := make(chan string,1)
go server1(output1)
go server2(output2)
select {
case s1 := <-output1:
fmt.Println(s1)
case s2 := <-output2:
fmt.Println(s2)
}
這個(gè)程序的結(jié)果要么是“from server1”或者“from server2”帆卓,因?yàn)閟elect讀取到一個(gè)數(shù)據(jù)后就返回了