Ваша программа завершается до того, как
zipMaker()
успевает обработать все данные: функция
main
завершается сразу после того, как завершается выполнение цикла.
Есть несколько вариантов решения этой проблема, какой выбрать, зависит от задачи:
1) если у вас программа должна работать постоянно, то тогда можно просто залочить ей выполнение. Например, так:
func main() {
// your code
locker := make(chan struct{})
<-locker
}
2) если же вам нужно обработать конечное количество изображений, то нужно переработать код. По моему мнению, не нужно вызывать
httpGet()
и
parser()
в горутинах. Лучше возвращать
[]Gallery
, после чего проходиться по нему и вызывать горутину для каждого элемента. При этом нужно воспользоваться
sync.WaitGroup
. Код будет выглядеть примерно так:
package main
import (
"log"
"sync"
"time"
)
// Для удобства
type Gallery int
func main() {
// То, что должна вернуть функция parser()
results := []Gallery{5, 6, 7, 8}
var wg sync.WaitGroup
for _, r := range results {
wg.Add(1)
go zipMaker(r, &wg)
}
log.Println("Wait")
// Ждём выполнения горутин
wg.Wait()
// "Done" напечатается через 2 секунды после "Wait"
log.Println("Done")
}
func zipMaker(g Gallery, wg *sync.WaitGroup) {
defer wg.Done()
// your code
time.Sleep(time.Second * 2)
}
sync.WaitGroup
позволяет ждать обработки всех данных. Подробнее можно почитать
тут.