回答編集履歴

3

補足追記

2021/09/27 04:41

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -8,13 +8,13 @@
8
8
 
9
9
  - チャネルの受信完了でgoroutine再開対象になる
10
10
 
11
- - チャネルの受信待ちに入る時、送信待ち済みの場合はgoroutineスイッチしません
11
+ - チャネルの受信待ちに入る時、送信待ち済みの場合は直ちに受信してgoroutineスイッチしません
12
12
 
13
13
  - チャネルの送信待ちに入る時、未受信待ちの場合は所属goroutineをブロックしgoroutineスイッチする
14
14
 
15
15
  - チャネルの送信完了でgoroutine再開対象になる
16
16
 
17
- - チャネルの送信待ちに入る時、受信待ち済みの場合はgoroutineスイッチしません
17
+ - チャネルの送信待ちに入る時、受信待ち済みの場合は直ちに送信してgoroutineスイッチしません
18
18
 
19
19
  - goroutine再開対象が複数ある場合はランダムなgoroutineが選ばれて動作を再開する(今回の例では2つしかgoroutineがないので必ずもう一つのgoroutineが動作を再開する)
20
20
 

2

追記

2021/09/27 04:40

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -1,38 +1,46 @@
1
1
  これチャネルの挙動をよく知っていないと理解しにくいです。
2
+
3
+ mainのgoroutine(送信側)とmain関数内で起こしたgoroutine(受信側)の2つが切り替わりながら動作します。
2
4
 
3
5
 
4
6
 
5
- - チャネルの受信待ち状態と実際の受信の間にgoroutineスイッチが入場合と入らない場合がある。
7
+ - チャネルの受信待ちに入る時、未送待ち場合は所属goroutineをブロックしgoroutineスイッチ
6
8
 
9
+ - チャネルの受信完了でgoroutine再開対象になる
10
+
11
+ - チャネルの受信待ちに入る時、送信待ち済みの場合はgoroutineスイッチしません
12
+
7
- - チャネルの送信待ち状態と実際の送信の間にgoroutineスイッチが入場合と入らない場合がある。
13
+ - チャネルの送信待ちに入る時、未受待ち場合は所属goroutineをブロックしgoroutineスイッチ
14
+
15
+ - チャネルの送信完了でgoroutine再開対象になる
16
+
17
+ - チャネルの送信待ちに入る時、受信待ち済みの場合はgoroutineスイッチしません
18
+
19
+ - goroutine再開対象が複数ある場合はランダムなgoroutineが選ばれて動作を再開する(今回の例では2つしかgoroutineがないので必ずもう一つのgoroutineが動作を再開する)
8
20
 
9
21
 
10
-
11
- mainのgoroutineとmain関数内で起こしたgoroutineの2つが切り替わりながら動作します。
12
22
 
13
23
  `case c <- x:`を`S`、`<-c`を`R`と記述してこのコードでどういう順番が発生しているのかを列挙してみましょう。
14
24
 
15
25
 
16
26
 
17
- - x=0を`S`送信待ちに入る(goroutineスイッチ)
27
+ 1. 初回の`S`送信待ちに入る(goroutineスイッチ)
18
28
 
19
- - `R`信待ちに入る(goroutineスイッ
29
+ 2. 初回の`R`は送信待ち済みのため直接`R`受信して「Goルーンの方」が表示される
20
30
 
21
- - `S`送信->`R`受信で「0 Goルーンの方」が表示される
31
+ 3. 次の`R`受信待ちに入る(goroutineスイッ
22
32
 
23
- - `R`受待ちに入る(goroutineスイッチ
33
+ 4. 側の処理が再開「フィボナッチの方」が表示される
24
34
 
25
- - 「フィボナッチの方」が表示される
35
+ 5. 次の`S`は受信待ち済みなので直接`S`送信して「フィボナッチの方」が表示される
26
36
 
27
- - 次の`S`は受信待ち済みなので直接`S`送信して「フィボナッチの方」が表示される
37
+ 6. 次の`S`信待ちに入る(goroutineスイッチ
28
38
 
29
- - `S`送待ちに入る(goroutineスイッ
39
+ 7. 側の処理が再開「Goルーンの方」が表示される
30
40
 
31
- - `R`受信「Goルーチンの方」が表示される
41
+ 8. 次の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
32
42
 
33
- - 次の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
34
-
35
- - 以上を繰り返す
43
+ 9. 3.に戻って繰り返す
36
44
 
37
45
 
38
46
 

1

投稿時にブラウザエラー発生、ロストした記述を書き直しました。

2021/09/27 04:39

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -7,6 +7,8 @@
7
7
  - チャネルの送信待ち状態と実際の送信の間にgoroutineスイッチが入る場合と入らない場合がある。
8
8
 
9
9
 
10
+
11
+ mainのgoroutineとmain関数内で起こしたgoroutineの2つが切り替わりながら動作します。
10
12
 
11
13
  `case c <- x:`を`S`、`<-c`を`R`と記述してこのコードでどういう順番が発生しているのかを列挙してみましょう。
12
14
 
@@ -22,10 +24,16 @@
22
24
 
23
25
  - x「フィボナッチの方」が表示される
24
26
 
25
- - 受信待ち済みなので直接`S`送信
27
+ - 次の`S`は受信待ち済みなので直接`S`送信して「フィボナッチの方」が表示される
26
-
27
- - 「フィボナッチの方」が表示される
28
28
 
29
29
  - `S`送信待ちに入る(goroutineスイッチ)
30
30
 
31
- - `R`受信で「1 Goルーチンの方」が表示される
31
+ - `R`受信で「Goルーチンの方」が表示される
32
+
33
+ - 次の`R`は送信待ち済みのため直接`R`受信して「Goルーチンの方」が表示される
34
+
35
+ - 以上を繰り返す
36
+
37
+
38
+
39
+ 結果としてそれぞれ2回ずつの表示を繰り返す挙動になります。