更多学习笔记和示例代码请访问:github.com/wenjianzhan…
Select
多渠道的选择
select {
case ret := <-reCh1:
t.Logf("result %s", ret)
case ret :=<-retCh2:
t.Logf("result %s", ret)
default:
t.Error("No one returned")
}
超时控制
select {
case ret := <-reCh1:
t.Logf("result %s", ret)
case <-time.After(time.Second * 1):
t.Error("time out")
}
示例代码
package _select
import (
"fmt"
"testing"
"time"
)
func service() string {
time.Sleep(time.Millisecond * 500)
return "Done"
}
func AsyncService() chan string {
retCh := make(chan string)
//retCh := make(chan string,1)
go func() {
ret := service()
fmt.Println("returned result.")
retCh <- ret
fmt.Println("service exited.")
}()
return retCh
}
func TestSelect(t *testing.T) {
select {
case ret := <-AsyncService():
t.Log(ret)
case <-time.After(time.Millisecond * 100):
t.Error("time out")
}
}
输出
=== RUN TestSelect
--- FAIL: TestSelect (0.10s)
select_test.go:31: time out
FAIL
Process finished with exit code 1
以上代码可以看出 service 函数被sleep了 time.Millisecond * 500,而设置的超时时间是 time.Millisecond * 100 所以执行超时,可以通过调整两个时间,分别执行代码会不会出现不一样的结果...
这里利用 select 的多路选择 可以实现程序进行超时控制的方法
select 如果都没有返回结果,那么就会阻塞在这里
更多学习笔记和示例代码请访问:github.com/wenjianzhan…