Skip to content

Commit f312cd8

Browse files
authored
Merge pull request #745 from devlights/add-go122-loop-variable-example
2 parents e6b2568 + 6e15703 commit f312cd8

File tree

3 files changed

+70
-10
lines changed

3 files changed

+70
-10
lines changed

examples/basic/loops/README.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
このディレクトリには以下のサンプルがあります。
44

5-
| file | example name | note |
6-
| ------------------------ | -------------------- | ---------------------------------------------------------------------- |
7-
| basic_for_loop.go | loops_basic_for_loop | 他の言語でも同じように存在する基本的な for-loop についてのサンプルです |
8-
| basic_foreach.go | loops_basic_foreach | Go での foreach ループのサンプルです |
9-
| channel_loop.go | loops_channel_loop | チャネルをループさせる場合のサンプルです |
10-
| map_loop.go | loops_map_loop | map のループについてのサンプルです |
11-
| range_loop.go | loops_range_loop | 単純に指定回数ループするためのサンプルです |
12-
| infinite_loop.go | loops_infinite_loop | 無限ループのサンプルです |
13-
| slice_loop.go | loops_slice_loop | スライスのループについてのサンプルです |
14-
| for_loop_two_variable.go | loops_two_variable | for ループで 2つの変数 を初期化してループさせるサンプルです |
5+
| file | example name | note |
6+
| ------------------------ | ------------------------- | ---------------------------------------------------------------------- |
7+
| basic_for_loop.go | loops_basic_for_loop | 他の言語でも同じように存在する基本的な for-loop についてのサンプルです |
8+
| basic_foreach.go | loops_basic_foreach | Go での foreach ループのサンプルです |
9+
| channel_loop.go | loops_channel_loop | チャネルをループさせる場合のサンプルです |
10+
| map_loop.go | loops_map_loop | map のループについてのサンプルです |
11+
| range_loop.go | loops_range_loop | 単純に指定回数ループするためのサンプルです |
12+
| infinite_loop.go | loops_infinite_loop | 無限ループのサンプルです |
13+
| slice_loop.go | loops_slice_loop | スライスのループについてのサンプルです |
14+
| for_loop_two_variable.go | loops_two_variable | for ループで 2つの変数 を初期化してループさせるサンプルです |
15+
| go122_loop_variable.go | loops_go122_loop_variable | Go 1.22 で導入された「ループ変数」の仕様変更についてのサンプルです. |

examples/basic/loops/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2525
m["loops_for_loop_copy_value"] = ForLoopCopyValue
2626
m["loops_diff_range_and_normal"] = DiffRangeLoopAndNormalLoop
2727
m["loops_range_loop_tmpvalue_with_array"] = RangeLoopTmpValueWithArray
28+
m["loops_go122_loop_variable"] = Go122LoopVariable
2829
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package loops
2+
3+
import "github.com/devlights/gomy/output"
4+
5+
// Go122LoopVariable は、Go 1.22 で導入された「ループ変数」の仕様変更についてのサンプルです.
6+
//
7+
// Go 1.22 より、for-range ループ中のループ変数がそれぞれ個別のアドレスを持つ変数となるように調整された。
8+
//
9+
// 以下、Go 1.22 のリリースノートより引用
10+
//
11+
// > Previously, the variables declared by a "for" loop were created once and updated by each iteration.
12+
// In Go 1.22, each iteration of the loop creates new variables, to avoid accidental sharing bugs.
13+
//
14+
// > 以前は、"for "ループで宣言された変数は一度作成され、各反復で更新されていました。
15+
// Go 1.22では、偶発的な共有バグを避けるため、ループの各反復で新しい変数が作成されます。
16+
//
17+
// # REFERENCES
18+
// - https://go.dev/blog/loopvar-preview
19+
// - https://go.dev/blog/go1.22
20+
// - https://go.dev/doc/go1.22#language
21+
func Go122LoopVariable() error {
22+
type st struct {
23+
v int
24+
}
25+
26+
var (
27+
items = []st{
28+
{v: 1},
29+
{v: 2},
30+
{v: 3},
31+
}
32+
)
33+
34+
// Go 1.21 までは、同じアドレスが出力される
35+
// Go 1.22 からは、別々のアドレスが出力される
36+
for v := range items {
37+
output.Stdoutf("[Value (Addr)]", "%v (%p)\n", v, &v)
38+
}
39+
40+
return nil
41+
42+
/*
43+
$ task
44+
task: [build] go build .
45+
task: [run] ./try-golang -onetime
46+
47+
ENTER EXAMPLE NAME: loops_go122_loop_variable
48+
49+
[Name] "loops_go122_loop_variable"
50+
[Value (Addr)] 0 (0xc0001a2908)
51+
[Value (Addr)] 1 (0xc0001a2910)
52+
[Value (Addr)] 2 (0xc0001a2918)
53+
54+
55+
[Elapsed] 37.92µs
56+
*/
57+
58+
}

0 commit comments

Comments
 (0)