It was necessary to use the WaitGroup action waiting group and pass the copy itself directly to the anonymous function. Do not consider it an advertisement, but found the solution in the book Go in practice on page 97.
func (ZL_LIST) Parse(FilesName []*Files) { unzipPath, err := filepath.Abs("tmp") files, err := ioutil.ReadDir(unzipPath) f := make([]*Files, 0) for _, file := range files { fileZip := new(Files) if !file.IsDir() && file.Name()[:1] != "." { fileZip.Name = file.Name() fileZip.PathUnzipFile = filepath.Join(unzipPath, file.Name()) f = append(f, fileZip) } } if err != nil { fmt.Printf("[ERROR] ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² %v", err) } names := make(nameMap, 1) var wg sync.WaitGroup var countHmLmFiles int = -1 var countHmFiles int = 0 var countLmFiles int = 0 var file *Files var l sync.Mutex for countHmLmFiles, file = range f { wg.Add(1) go func(filename *Files) { parseHmLm(filename, &countHmFiles, &countLmFiles, &names, &l) //parseHmLm(filename) wg.Done() }(file) } wg.Wait() fmt.Printf("[INFO] ΠΡΠΎΡΠΈΡΠ°Π½ΠΎ %d ΡΠ°ΠΉΠ»ΠΎΠ²Π± ΠΈΠ· Π½ΠΈΡ
HM ΡΠ°ΠΉΠ»ΠΎΠ² %d ΠΈ LM ΡΠ°ΠΉΠ»ΠΎΠ² %d ", countHmLmFiles+1, countHmFiles, countLmFiles) } func parseHmLm(filename *Files, countHmFiles *int, countLmFiles *int, names *nameMap, l *sync.Mutex) { fmt.Println("[INFO] ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΉΠ» ", filename.Name, " Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ", filename.Name[:2]) xmlFile, err := os.Open(filepath.Join(filename.PathUnzipFile)) if err != nil { fmt.Printf("[ERROR] Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ ΡΠ°ΠΉΠ» %e \n", err) } defer xmlFile.Close() switch filename.Name[:2] { case "HM": l.Lock() (*names)[filename.Name] = true (*countHmFiles) += 1 l.Unlock() var hFile ZL_LIST decoder := xml.NewDecoder(xmlFile) decoder.CharsetReader = charset err := decoder.Decode(&hFile) if err != nil { fmt.Errorf("[ERROR] Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» %e", err) } case "LM": l.Lock() (*countLmFiles) += 1 l.Unlock() var lFile PERS_LIST decoder := xml.NewDecoder(xmlFile) decoder.CharsetReader = charset err := decoder.Decode(&lFile) if err != nil { fmt.Errorf("[ERROR] Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ» %e", err) } } } func charset(charset string, input io.Reader) (io.Reader, error) { switch charset { case "windows-1251": return charmap.Windows1251.NewDecoder().Reader(input), nil default: return nil, fmt.Errorf("unknown charset: %s", charset) } }