用一个简单的程序介绍一下withcancel的context,我们一般写goroutine的时候会在里面做一个for{},同时在for的里面还会做一个select{}判断接收当前的chan,不同的chan做不同的动作。
context也是利用了这样的结构,context提供了取消函数,cancelFunc可以随时终止goroutine。方式goroutine中的for循环一直循环下去。
package main
import (
"context"
"errors"
"fmt"
"time"
)
var c = 1
func doSome(i int) error {
c++
fmt.Println(c)
if c > 3 {
return errors.New("err occur")
}
return nil
}
func speakMemo(ctx context.Context, cancelFunc context.CancelFunc) {
for {
select {
case <-ctx.Done():
fmt.Printf("ctx.Done")
return
default:
fmt.Println("exec default func")
err := doSome(3)
if err != nil {
fmt.Printf("cancelFunc()")
cancelFunc()
}
}
}
}
func main() {
rootContext := context.Background()
ctx, cancelFunc := context.WithCancel(rootContext)
go speakMemo(ctx, cancelFunc)
time.Sleep(time.Second * 5)
}
运行结果:
exec default func
2
exec default func
3
exec default func
4
cancelFunc()ctx.Done