Нет необходимости использовать *[][]float64
, поскольку это будет двойной указатель.
Я сделал несколько небольших изменений в вашей программе.
dataset
доступно для новой программы, поскольку она объявлена в блоке кода выше.
Аналогично record
также доступен, но поскольку переменная record
время от времени меняется, нам нужно передать ее новой программе.
Хотя нет необходимости передавать dataset
, так как он не меняется и это то, что мы хотим, чтобы мы могли добавить temp к dataset
.
Но состояние гонки происходит, когда несколько goroutines пытаются добавить одну и ту же переменную, т.е. несколько goroutines пытаются записать в одну и ту же переменную.
Таким образом, мы должны убедиться, что в каждый момент времени может быть добавлена только одна программа.
Поэтому мы используем блокировку для последовательного добавления.
package main
import (
"bufio"
"encoding/csv"
"fmt"
"os"
"strconv"
"sync"
)
func loadCSV(csvFile string) [][]float64 {
var dataset [][]float64
f, _ := os.Open(csvFile)
r := csv.NewReader(f)
var wg sync.WaitGroup
l := new(sync.Mutex) // lock
for record, err := r.Read(); err == nil; record, err = r.Read() {
wg.Add(1)
go func(record []string) {
defer wg.Done()
var temp []float64
for _, each := range record {
if f, err := strconv.ParseFloat(each, 64); err == nil {
temp = append(temp, f)
}
}
l.Lock() // lock before writing
dataset = append(dataset, temp) // write
l.Unlock() // unlock
}(record)
}
wg.Wait()
return dataset
}
func main() {
dataset := loadCSV("train.csv")
fmt.Println(len(dataset))
}
Некоторые ошибки не были обработаны, чтобы сделать его минимальным, но вы должны обрабатывать ошибки.