0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Golang】標準パッケージ context

Posted at

#【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("ループ抜けた")
}

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?