コンテキストの使い方.go to signal signal goroutine補完におけるdonemethod ()メソッド


ここでは、Goroutineで実行されたタスクの完了を通知するためにcontextパッケージの基本的な使用法の例を示します.
package main

import (
    "context"
    "log"
    "time"
)

const interval = 500

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go func() {
        time.Sleep(5 * interval * time.Millisecond)
        cancel()
    }()
    f(ctx)
}

func f(ctx context.Context) {
    ticker := time.NewTicker(interval * time.Millisecond)
    for {
        select {
        case <-ticker.C:
            doSomething()
        case <-ctx.Done():
            return
        }
    }
}

func doSomething() { log.Println("tick") }
Playground linkdoSomething()の機能が完了する前に、この例ではtime.Sleep(...)が実行され、cancelによって作成されたcontext.WithCancel(...)関数は242479142ループを終了し、終了するチャネルctx.Done()に値を送信します.forはコンテクストパッケージdocumentationに記述されているような新しいコンテキスト変数を作成するためのベースとして使用される.
これはGoroutineで実行されたタスクの完了を合図する便利な方法であり、この文脈では、context.Background()の使用方法に対して強力な代替手段です.