From 51933fd221feace51791ac6b0d78795bf3bdc184 Mon Sep 17 00:00:00 2001 From: devlights Date: Thu, 24 Apr 2025 04:51:12 +0000 Subject: [PATCH] Add loops/dowhile.go --- examples/basic/loops/README.md | 1 + examples/basic/loops/dowhile.go | 59 ++++++++++++++++++++++++++++++++ examples/basic/loops/examples.go | 1 + 3 files changed, 61 insertions(+) create mode 100644 examples/basic/loops/dowhile.go diff --git a/examples/basic/loops/README.md b/examples/basic/loops/README.md index dcdbbd4e..06bf5ee4 100644 --- a/examples/basic/loops/README.md +++ b/examples/basic/loops/README.md @@ -14,3 +14,4 @@ | for_loop_two_variable.go | loops_two_variable | for ループで 2つの変数 を初期化してループさせるサンプルです | | go122_loop_variable.go | loops_go122_loop_variable | Go 1.22 で導入された「ループ変数」の仕様変更についてのサンプルです. | | go122_range_over_integer.go | loops_go122_range_over_integer | Go 1.22 で導入された range over integers ループ機能のサンプルです. | +| dowhile.go | loops_dowhile | Goで他の言語にある do-while と同様のことを行うサンプルです. | diff --git a/examples/basic/loops/dowhile.go b/examples/basic/loops/dowhile.go new file mode 100644 index 00000000..7e6cc8e9 --- /dev/null +++ b/examples/basic/loops/dowhile.go @@ -0,0 +1,59 @@ +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 +} diff --git a/examples/basic/loops/examples.go b/examples/basic/loops/examples.go index 57b3f50e..27b7e1e1 100644 --- a/examples/basic/loops/examples.go +++ b/examples/basic/loops/examples.go @@ -27,4 +27,5 @@ func (r *register) Regist(m mapping.ExampleMapping) { m["loops_range_loop_tmpvalue_with_array"] = RangeLoopTmpValueWithArray m["loops_go122_loop_variable"] = Go122LoopVariable m["loops_go122_range_over_integer"] = Go122RangeOverInterger + m["loops_dowhile"] = DoWhile }