teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

よりベターな回答

2021/01/17 21:09

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -12,4 +12,53 @@
12
12
  UMLのアクティビティ図でいうところの
13
13
  フォークに相当するのが「go」キーワード、
14
14
  ジョインに相当するのは「chan」か「sync.WaitGroup」が使えます。
15
- ジョインの目的のために両方を使う必要はありません。
15
+ ジョインの目的のために両方を使う必要はありません。
16
+
17
+ ## Gopherの書き方
18
+
19
+ 以下の様にすると目的をはたしつつ、WaitGroupも不要です。
20
+ (この書き方がgoroutineから戻り値のある場合のジョインの仕方です。)
21
+
22
+ [https://play.golang.org/p/rnMk6ESJdui](https://play.golang.org/p/rnMk6ESJdui)
23
+ ```go
24
+ package main
25
+
26
+ import "fmt"
27
+
28
+ func main() {
29
+
30
+ messages := []string{}
31
+ test := make(chan []string)
32
+
33
+ go func() {
34
+ // アイウエオ店
35
+ // page := chrome()
36
+ // page.Navigate("https://www.アイウエオ.co.jp/")
37
+ title1 := "アイウエオ"
38
+
39
+ y := []string{}
40
+ // ...
41
+ y = append(y, title1)
42
+
43
+ test <- y
44
+ }()
45
+
46
+ go func() {
47
+ // かきくけこ店
48
+ // page := chrome()
49
+ // page.Navigate("https://www.かきくけこ.co.jp/")
50
+
51
+ title2 := "かきくけこ"
52
+
53
+ a := []string{}
54
+ // ...
55
+ a = append(a, title2)
56
+
57
+ test <- a
58
+ }()
59
+
60
+ messages = append(messages, <-test...)
61
+ messages = append(messages, <-test...)
62
+ fmt.Println("titles:", messages)
63
+ }
64
+ ```

2

追記

2021/01/17 21:09

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -5,4 +5,11 @@
5
5
  (結果の受け取りは1度ではなく2度にする必要はあります。)
6
6
 
7
7
  余談ですが、明確な理由なくスライスのキャパシティを指定するのはやめましょう。
8
- (多くのケースで自動拡張に任せるほうが良いことが多いと思います)
8
+ (多くのケースで自動拡張に任せるほうが良いことが多いと思います)
9
+
10
+ ### 追記
11
+
12
+ UMLのアクティビティ図でいうところの
13
+ フォークに相当するのが「go」キーワード、
14
+ ジョインに相当するのは「chan」か「sync.WaitGroup」が使えます。
15
+ ジョインの目的のために両方を使う必要はありません。

1

解決案追記

2021/01/14 23:58

投稿

nobonobo
nobonobo

スコア3367

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