Я хочу одновременно анализировать файлы с помощью функции parseFile()
и присваивать ее возвращаемые значения полям структуры с типом fileInfo
, который находится во фрагменте структур files []fileInfo
.
files
Структура предварительно заполнена элементами fileInfo
, и я хочу обновить поля A,B
каждого элемента fileInfo
в срезе.
Вопрос: мой код идиоматичен для Go или его нужно решить по-другому?
Сейчас я использую sync.Mutex
, чтобы заблокировать структуру в срезе, но мне интересно, есть ли лучшийрешение для этой задачи или если код даже правильный и не просто работает случайно.
type fileInfo struct {
A []string
B string
Path string
UpdateMutex sync.Mutex
}
func parseFile(filePath string) ([]string, string, error) {
var a []string
var b string
var err error
//do some parsing
//...
return a, b, err
}
func main() {
var files []fileInfo
//pre-populate fileInfo
wg := new(sync.WaitGroup)
for i, _ := range files {
wg.Add(1)
go func(pFile *fileInfo) {
var err error
defer wg.Done()
pFile.UpdateMutex.Lock()
pFile.A, pFile.B, err = parseFile(pFile.Path)
pFile.UpdateMutex.Unlock()
if err != nil {
fmt.Println(err)
}
}(&files[i])
}
//more work
//...
wg.Wait()
//continue
}
Я думал об использовании каналов, но я не могу полностью обдумать, как можно обновить конкретный files[i].A
с использованием канала.