[go学习笔记]二十三、go语言中多路选择和超时控制的实现

121 阅读1分钟

更多学习笔记和示例代码请访问: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…