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

回答編集履歴

1

別の回答例を追記

2020/07/25 06:58

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -45,4 +45,57 @@
45
45
  func common() {
46
46
  fmt.Println("common")
47
47
  }
48
+ ```
49
+
50
+ 大切なのは出力がcommonが決めた内容とhoge#が決めた内容が「一塊」であるということ。
51
+ 実装例のひとつは以下の通り。
52
+ messageQueueには文字列スライスを投入可能にして、
53
+
54
+ - common決定した文字列とhoge1が決定した文字列をセットでキューに投げ込む
55
+ - common決定した文字列とhoge2が決定した文字列をセットでキューに投げ込む
56
+
57
+ 別のgoroutineでmessageQueueの内容をひたすらfmt.Printする。
58
+ [https://play.golang.org/p/DyFpZfb1YLb](https://play.golang.org/p/DyFpZfb1YLb)
59
+ ```go
60
+ package main
61
+
62
+ import (
63
+ "fmt"
64
+ )
65
+
66
+ func main() {
67
+ messageQueue := make(chan []string, 10)
68
+ go func() {
69
+ for v := range messageQueue {
70
+ for _, s := range v {
71
+ fmt.Println(s)
72
+ }
73
+ }
74
+ }()
75
+ ch := make(chan bool, 10)
76
+ for i := 0; i < 100; i++ {
77
+ ch <- true
78
+ go func() {
79
+ fuga(messageQueue)
80
+ <-ch
81
+ }()
82
+ }
83
+ }
84
+
85
+ func fuga(msg chan<- []string) {
86
+ hoge1(msg)
87
+ hoge2(msg)
88
+ }
89
+
90
+ func hoge1(msg chan<- []string) {
91
+ msg <- []string{common(), "hoge1"}
92
+ }
93
+
94
+ func hoge2(msg chan<- []string) {
95
+ msg <- []string{common(), "hoge2"}
96
+ }
97
+
98
+ func common() string {
99
+ return "common"
100
+ }
48
101
  ```