関連記事
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のおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。