Contex也是Go的一个特性,其实我还处于使用级别,这里有一个如何cancle掉withValue的contex示例
package main import ( "context" "fmt" "time" ) func main() { //ctx, cancel := context.WithCancel(context.Background()) ctx, _ := context.WithTimeout(context.Background(), 3 * time.Second) //ctx := context.WithValue(context.Background(), "huhu", "ssssss") go HandleRequest(ctx) time.Sleep(10 * time.Second) //cancel() } func HandleRequest(ctx context.Context) { go WriteDatabase(context.WithValue(ctx, "huhu", "hhhhh")) for { select { default: fmt.Println("HandleRequest running", ctx.Value("huhu")) case <-ctx.Done(): fmt.Println("HandleRquest Done") return } } } func WriteDatabase(ctx context.Context) { for { select { default: fmt.Println("WriteDatabase running", ctx.Value("huhu")) case <-ctx.Done(): fmt.Println("WriteDatabase Done") return } } }
这里还是上下文的特性,我们本质上是用的一个contex,父级cancel就ok了。