回答編集履歴

1

別の回答例を追記

2020/07/25 06:58

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -93,3 +93,109 @@
93
93
  }
94
94
 
95
95
  ```
96
+
97
+
98
+
99
+ 大切なのは出力がcommonが決めた内容とhoge#が決めた内容が「一塊」であるということ。
100
+
101
+ 実装例のひとつは以下の通り。
102
+
103
+ messageQueueには文字列スライスを投入可能にして、
104
+
105
+
106
+
107
+ - common決定した文字列とhoge1が決定した文字列をセットでキューに投げ込む
108
+
109
+ - common決定した文字列とhoge2が決定した文字列をセットでキューに投げ込む
110
+
111
+
112
+
113
+ 別のgoroutineでmessageQueueの内容をひたすらfmt.Printする。
114
+
115
+ [https://play.golang.org/p/DyFpZfb1YLb](https://play.golang.org/p/DyFpZfb1YLb)
116
+
117
+ ```go
118
+
119
+ package main
120
+
121
+
122
+
123
+ import (
124
+
125
+ "fmt"
126
+
127
+ )
128
+
129
+
130
+
131
+ func main() {
132
+
133
+ messageQueue := make(chan []string, 10)
134
+
135
+ go func() {
136
+
137
+ for v := range messageQueue {
138
+
139
+ for _, s := range v {
140
+
141
+ fmt.Println(s)
142
+
143
+ }
144
+
145
+ }
146
+
147
+ }()
148
+
149
+ ch := make(chan bool, 10)
150
+
151
+ for i := 0; i < 100; i++ {
152
+
153
+ ch <- true
154
+
155
+ go func() {
156
+
157
+ fuga(messageQueue)
158
+
159
+ <-ch
160
+
161
+ }()
162
+
163
+ }
164
+
165
+ }
166
+
167
+
168
+
169
+ func fuga(msg chan<- []string) {
170
+
171
+ hoge1(msg)
172
+
173
+ hoge2(msg)
174
+
175
+ }
176
+
177
+
178
+
179
+ func hoge1(msg chan<- []string) {
180
+
181
+ msg <- []string{common(), "hoge1"}
182
+
183
+ }
184
+
185
+
186
+
187
+ func hoge2(msg chan<- []string) {
188
+
189
+ msg <- []string{common(), "hoge2"}
190
+
191
+ }
192
+
193
+
194
+
195
+ func common() string {
196
+
197
+ return "common"
198
+
199
+ }
200
+
201
+ ```