golang中context基本使用withcancel

用一个简单的程序介绍一下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

 

你可能感兴趣的:(golang)