いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-557 (forループとtime.Before()を組み合わせて「Nの時間分何かを行う」)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

私自身は結構よく利用しているパターンです。forループとtime.Beforeを組み合わせます。

「5秒間◯◯をする」のような処理書くときに使っています。

サンプル

#

package times

import (
    "context"
    "math"
    "sync"
    "time"
)

// DoNDurations は、forループとtime.Now().Before()を組み合わせて「Nの時間分何かを行う」という処理のサンプルです。
func DoNDurations() error {
    var (
        ctx = context.Background()
        wg  = sync.WaitGroup{}
        d   = 3 * time.Second
    )
    wg.Add(1)

    go func(ctx context.Context, d time.Duration) {
        defer wg.Done()

        // 指定された時間分、何かする
        var (
            end = time.Now().Add(d)
        )
        for time.Now().Before(end) {
            // 何か処理したことにする。
            for i := range 1000000 {
                _ = math.Sqrt(float64(i * i))
            }

            select {
            case <-ctx.Done():
                return
            default:
            }
        }
    }(ctx, d)

    wg.Wait()

    return nil
}

shell

実行すると以下のように出力されます。

$ task
task: [build] go build -o "/workspace/try-golang/try-golang" .
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: time_do_n_duration

[Name] "time_do_n_duration"


[Elapsed] 3.00047569s

参考情報

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。