Skip to content

Commit 06c95d7

Browse files
authored
Merge pull request #914 from devlights/add-go-dowhile-example
2 parents 538c3c9 + 51933fd commit 06c95d7

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

examples/basic/loops/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@
1414
| for_loop_two_variable.go | loops_two_variable | for ループで 2つの変数 を初期化してループさせるサンプルです |
1515
| go122_loop_variable.go | loops_go122_loop_variable | Go 1.22 で導入された「ループ変数」の仕様変更についてのサンプルです. |
1616
| go122_range_over_integer.go | loops_go122_range_over_integer | Go 1.22 で導入された range over integers ループ機能のサンプルです. |
17+
| dowhile.go | loops_dowhile | Goで他の言語にある do-while と同様のことを行うサンプルです. |

examples/basic/loops/dowhile.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package loops
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"net"
8+
"os"
9+
"time"
10+
)
11+
12+
// DoWhile は、Goで他の言語にある do-while と同様のことを行うサンプルです.
13+
//
14+
// Goにはループ制御が for しかないので、他の言語にある do-while は当然構文としては用意されていない。
15+
// しかし、for で同じことは当然出来る。
16+
func DoWhile() error {
17+
type (
18+
ctxKey struct{}
19+
)
20+
const (
21+
retryMax = 2
22+
)
23+
var (
24+
l = log.New(os.Stdout, "", log.Lmicroseconds)
25+
i = 0
26+
ctx = context.Background()
27+
28+
fn = func(ctx context.Context) {
29+
// なんか処理している風
30+
_, err := net.DialTimeout("tcp", ":12345", 10*time.Millisecond)
31+
l.Printf("[%d] %v", ctx.Value(ctxKey{}).(int), err)
32+
}
33+
hr = func() {
34+
fmt.Println("--------------------------------")
35+
}
36+
)
37+
38+
// do-while の代替 (1)
39+
for {
40+
fn(context.WithValue(ctx, ctxKey{}, i))
41+
i++
42+
43+
// do-whileの条件判定の代わり
44+
if i > retryMax {
45+
break
46+
}
47+
}
48+
49+
hr()
50+
51+
// do-while の代替 (2)
52+
i = 0
53+
for ok := true; ok; ok = (i <= retryMax) {
54+
fn(context.WithValue(ctx, ctxKey{}, i))
55+
i++
56+
}
57+
58+
return nil
59+
}

examples/basic/loops/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2727
m["loops_range_loop_tmpvalue_with_array"] = RangeLoopTmpValueWithArray
2828
m["loops_go122_loop_variable"] = Go122LoopVariable
2929
m["loops_go122_range_over_integer"] = Go122RangeOverInterger
30+
m["loops_dowhile"] = DoWhile
3031
}

0 commit comments

Comments
 (0)