以下の内容はhttps://devlights.hatenablog.com/entry/2025/04/25/073000より取得しました。


Goメモ-569 (Goでdo-while文)

関連記事

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

概要

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

別の言語をやっていて、Goに触れた人からちょこちょこ聞かれる質問に以下があります。

do-while文って無いの?

私自身は、他の言語でも do-while とかはあまり利用しないタイプ(大抵forで書いちゃう)ので、あまり気にならないのですが、気になる人は多いみたいですね。

結構聞かれます。リトライ処理とかで良く利用されますね。

Goにはfor文しかないので、do-whileという構文は無いのですが当然出来ます。

サンプル

dowhile.go

package loops

import (
    "context"
    "fmt"
    "log"
    "net"
    "os"
    "time"
)

// DoWhile は、Goで他の言語にある do-while と同様のことを行うサンプルです.
//
// Goにはループ制御が for しかないので、他の言語にある do-while は当然構文としては用意されていない。
// しかし、for で同じことは当然出来る。
func DoWhile() error {
    type (
        ctxKey struct{}
    )
    const (
        retryMax = 2
    )
    var (
        l   = log.New(os.Stdout, "", log.Lmicroseconds)
        i   = 0
        ctx = context.Background()

        fn = func(ctx context.Context) {
            // なんか処理している風
            _, err := net.DialTimeout("tcp", ":12345", 10*time.Millisecond)
            l.Printf("[%d] %v", ctx.Value(ctxKey{}).(int), err)
        }
        hr = func() {
            fmt.Println("--------------------------------")
        }
    )

    // do-while の代替 (1)
    for {
        fn(context.WithValue(ctx, ctxKey{}, i))
        i++

        // do-whileの条件判定の代わり
        if i > retryMax {
            break
        }
    }

    hr()

    // do-while の代替 (2)
    i = 0
    for ok := true; ok; ok = (i <= retryMax) {
        fn(context.WithValue(ctx, ctxKey{}, i))
        i++
    }

    return nil
}

実行結果

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

ENTER EXAMPLE NAME: loops_dowhile

[Name] "loops_dowhile"
04:56:01.320937 [0] dial tcp :12345: connect: connection refused
04:56:01.321099 [1] dial tcp :12345: connect: connection refused
04:56:01.321183 [2] dial tcp :12345: connect: connection refused
--------------------------------
04:56:01.321272 [0] dial tcp :12345: connect: connection refused
04:56:01.321366 [1] dial tcp :12345: connect: connection refused
04:56:01.321460 [2] dial tcp :12345: connect: connection refused


[Elapsed] 718.461µs

参考情報

Goのおすすめ書籍


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

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




以上の内容はhttps://devlights.hatenablog.com/entry/2025/04/25/073000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14