回答編集履歴

3

よりベターな回答

2021/01/17 21:09

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -27,3 +27,101 @@
27
27
  ジョインに相当するのは「chan」か「sync.WaitGroup」が使えます。
28
28
 
29
29
  ジョインの目的のために両方を使う必要はありません。
30
+
31
+
32
+
33
+ ## Gopherの書き方
34
+
35
+
36
+
37
+ 以下の様にすると目的をはたしつつ、WaitGroupも不要です。
38
+
39
+ (この書き方がgoroutineから戻り値のある場合のジョインの仕方です。)
40
+
41
+
42
+
43
+ [https://play.golang.org/p/rnMk6ESJdui](https://play.golang.org/p/rnMk6ESJdui)
44
+
45
+ ```go
46
+
47
+ package main
48
+
49
+
50
+
51
+ import "fmt"
52
+
53
+
54
+
55
+ func main() {
56
+
57
+
58
+
59
+ messages := []string{}
60
+
61
+ test := make(chan []string)
62
+
63
+
64
+
65
+ go func() {
66
+
67
+ // アイウエオ店
68
+
69
+ // page := chrome()
70
+
71
+ // page.Navigate("https://www.アイウエオ.co.jp/")
72
+
73
+ title1 := "アイウエオ"
74
+
75
+
76
+
77
+ y := []string{}
78
+
79
+ // ...
80
+
81
+ y = append(y, title1)
82
+
83
+
84
+
85
+ test <- y
86
+
87
+ }()
88
+
89
+
90
+
91
+ go func() {
92
+
93
+ // かきくけこ店
94
+
95
+ // page := chrome()
96
+
97
+ // page.Navigate("https://www.かきくけこ.co.jp/")
98
+
99
+
100
+
101
+ title2 := "かきくけこ"
102
+
103
+
104
+
105
+ a := []string{}
106
+
107
+ // ...
108
+
109
+ a = append(a, title2)
110
+
111
+
112
+
113
+ test <- a
114
+
115
+ }()
116
+
117
+
118
+
119
+ messages = append(messages, <-test...)
120
+
121
+ messages = append(messages, <-test...)
122
+
123
+ fmt.Println("titles:", messages)
124
+
125
+ }
126
+
127
+ ```

2

追記

2021/01/17 21:09

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -13,3 +13,17 @@
13
13
  余談ですが、明確な理由なくスライスのキャパシティを指定するのはやめましょう。
14
14
 
15
15
  (多くのケースで自動拡張に任せるほうが良いことが多いと思います)
16
+
17
+
18
+
19
+ ### 追記
20
+
21
+
22
+
23
+ UMLのアクティビティ図でいうところの
24
+
25
+ フォークに相当するのが「go」キーワード、
26
+
27
+ ジョインに相当するのは「chan」か「sync.WaitGroup」が使えます。
28
+
29
+ ジョインの目的のために両方を使う必要はありません。

1

解決案追記

2021/01/14 23:58

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -1,3 +1,15 @@
1
1
  WaitGroupとtestチャネルがどちらも待ち受けしていてチャネルの動作条件が満たされません。
2
2
 
3
3
  チャネルはバッファ無しの場合、送信待ちと受信待ちが双方スタンバイになるまでブロックします。
4
+
5
+
6
+
7
+ 解決方法のひとつはtestチャネルをバッファ付きでサイズを2以上にすることです。
8
+
9
+ (結果の受け取りは1度ではなく2度にする必要はあります。)
10
+
11
+
12
+
13
+ 余談ですが、明確な理由なくスライスのキャパシティを指定するのはやめましょう。
14
+
15
+ (多くのケースで自動拡張に任せるほうが良いことが多いと思います)