【Golang】標準パッケージ context

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

package main

//context
/*
簡単なゴルーチンとチャネルを作ってある。

長くかかりすぎる処理の場合キャンセルして欲しい場合に使われる
WEBアプリケーションで、ユーザーからのリクエストを処理するのが長かったりの場合にキャンセルするなど。
*/

import (
    "context"
    "fmt"
    "time"
)

func longProcess(ctx context.Context, ch chan string) {
    fmt.Println("開始")
    time.Sleep(2 * time.Second)
    fmt.Println("終了")
    ch <- "実行結果"
}

func main() {
    ch := make(chan string)
    //長くかかりすぎる場合キャンセルして欲しい
    //contextを作成
    ctx := context.Background()
    //ctxを1秒間のタイムアウトをつけたもので再定義
    //longProcessより短いと、エラーで終了できる。
    ctx, cancel := context.WithTimeout(ctx, 1*time.Second)

    //もしタイムアウトしたら、定義したcancelを実行
    //ctx.Done()へ入る
    defer cancel()

    //ctxを渡す
    //1秒間で処理が終わらなかったらゴルーチンを終了する
    go longProcess(ctx, ch)

    //goroutinの直後にキャンセルすると、強制終了され実行されない
    //途中でキャンセルさせたい場合など
    //cancel()

    //名前付きループ
CTXLOOP:
    for {
        select {
        //キャンセルされたら
        //完了しなかったら、エラー出力
        case <-ctx.Done():
            fmt.Println("##########Error###########")
            fmt.Println(ctx.Err())
            //ループを抜ける
            break CTXLOOP
        case s := <-ch:
            fmt.Println(s)
            fmt.Println("success")
            break CTXLOOP
        }

    }

    //ループを抜けたら
    fmt.Println("ループ抜けた")
}

广告
将在 10 秒后关闭
bannerAds