Диана обнови решението на 09.11.2015 16:08 (преди над 2 години)
+package main
+
+import "fmt"
+
+func OrderedLogDrainer(logs chan (chan string)) chan string {
+ result := make(chan string)
+ go drainChannels(logs, result)
+ return result
+}
+
+func drainChannels(logs chan (chan string), result chan string) {
+ orderedChannels := make(chan (chan string), 100)
+ go fillLogs(logs, orderedChannels)
+ for channel := range orderedChannels {
+ for log := range channel {
+ result <- log
+ }
+ }
+ close(result)
+}
+
+func fillLogs(logs chan (chan string), orderedChannels chan (chan string)) {
+ var logNumber int = 1
+ for log := range logs {
+ orderedChannel := make(chan string, 100)
+ go drainLog(logNumber, log, orderedChannel)
+ orderedChannels <- orderedChannel
+ logNumber++
+ }
+ close(orderedChannels)
+}
+
+func drainLog(logNumber int, log chan string, formattedLog chan string) {
+ for content := range log {
+ formattedLog <- formatString(logNumber, content)
+ }
+ close(formattedLog)
+}
+
+func formatString(logNumber int, content string) string {
+ return fmt.Sprintf("%d\t%s", logNumber, content)
+}
Изглежда супер! Единственият проблем, който виждам е, че няма да работи с повече от 100 лога. В условието сме ограничили броя съобщения във всеки лог до 100, но никъде не сме казали, че ще има под 100 лога.