golang: Вставка данных в один массив из нескольких горутин
Как правильно написать код максимально быстрой работы всех пяти функций f1-f5
по вставке данных в один массив test
? На примере кода, который работает криво:
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
var data = []string{}
var test = []string{}
var ch_i = []chan string{}
var ch_o = []string{}
var ch = make(chan string, 'z')
func f0() {
for j := 0; j < 10; j++ {
data = append(data, strconv.Itoa(j))
}
fmt.Println("\n data: ", data)
}
func main() {
f0()
// - - - - - -
go f1("A", ch)
go f2("B", ch)
f3("C", ch)
go f4("D", ch)
go f5("E", ch)
// - - - - - -
time.Sleep(3 * time.Second)
fmt.Println("\nlen ch_i: ", len(ch_i), "\ncap ch_i: ", cap(ch_i), "\n ch_i: ", ch_i, "\n ")
fmt.Println("\nlen ch_o: ", len(ch_o), "\ncap ch_o: ", cap(ch_o), "\n ch_o: ", strings.Join(ch_o, ", "), "\n ")
fmt.Println("\nlen test: ", len(test), "\ncap test: ", cap(test), "\n test: ", strings.Join(test, ", "), "\n ")
}
func f1(s string, ch chan string) {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Nanosecond)
ch_i = append(ch_i, ch)
test = append(test, s+data[i])
ch_o = append(ch_o, "a")
ch <- "a"
}
}
func f2(s string, ch chan string) {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Nanosecond)
ch_i = append(ch_i, ch)
test = append(test, s+data[i])
ch_o = append(ch_o, "b")
ch <- "b"
}
}
func f3(s string, ch chan string) {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Nanosecond)
ch_i = append(ch_i, ch)
test = append(test, s+data[i])
ch_o = append(ch_o, "c")
ch <- "c"
}
}
func f4(s string, ch chan string) {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Nanosecond)
ch_i = append(ch_i, ch)
test = append(test, s+data[i])
ch_o = append(ch_o, "d")
ch <- "d"
}
}
func f5(s string, ch chan string) {
for i := 0; i < 10; i++ {
time.Sleep(10 * time.Nanosecond)
ch_i = append(ch_i, ch)
test = append(test, s+data[i])
ch_o = append(ch_o, "e")
ch <- "e"
}
}
Источник: Stack Overflow на русском