Одновременное обновление / доступ к структурам в части структур - PullRequest
0 голосов
/ 10 октября 2019

Я хочу одновременно анализировать файлы с помощью функции 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 с использованием канала.

...