hi, I did not close the other channels, but adding this to the select code seems to fix it:
for { select { case err := <-errCh: fmt.Println(err) case data := <-resCh: fmt.Println("from result channel: ", data) case <-doneCh: fmt.Printf("processed %d files, done now\n", len(files)) os.Exit(0) } If I remove the os.Exit(0) call, then I keep getting the processed 1000 files, done now processed 1000 files, done now processed 1000 files, done now ... until I interrupt. the process with ctrl-c. With the os.Exit() It finishes with the proper output, as far as I can see. I need to understand this better, will get there xp. On Thu, May 22, 2025 at 10:37 AM thatipelli santhosh < santhoshthatipelli...@gmail.com> wrote: > I think need to close errCh, resCh > > On Thu, May 22, 2025 at 1:44 PM natxo....@gmail.com < > natxo.ase...@gmail.com> wrote: > >> hi, >> >> I do not seem to to get this one to not panic, and do not understand why >> yet. >> >> This code gets the names of files using shell globbing , so go run >> testchannels.go dir/* >> >> This gets the name and size info of all 1000 files in the dire, but >> panics at the end with a deadlock: >> >> fatal error: all goroutines are asleep - deadlock! >> >> goroutine 1 [select]: >> main.run({0xc000118018, 0x3e8, 0x57f308?}) >> /pathtestchannels.go:44 +0x278 >> main.main() >> /path/testchannels.go:15 +0x66 >> exit status 2 >> >> I do not seem to be able to find my mistake. Any hints appreciated ;-). >> >> package main >> >> import ( >> "flag" >> "fmt" >> "os" >> "sync" >> ) >> >> func main() { >> flag.Parse() >> >> files := flag.Args() >> >> run(files) >> >> } >> >> func run(files []string) { >> errCh := make(chan error, 10) >> resCh := make(chan string, 10) >> doneCh := make(chan struct{}) >> wg := sync.WaitGroup{} >> >> for _, file := range files { >> wg.Add(1) >> go func(file string) { >> defer wg.Done() >> f, err := os.Stat(file) >> if err != nil { >> errCh <- fmt.Errorf("could not stat %s: >> %w\n", file, err) >> } >> resCh <- fmt.Sprintf("name: %s\t size: %d", >> f.Name(), f.Size()) >> >> }(file) >> } >> >> go func() { >> wg.Wait() >> close(doneCh) >> }() >> >> for { >> select { >> case err := <-errCh: >> fmt.Println(err) >> case data := <-resCh: >> fmt.Println("from result channel: ", data) >> } >> } >> } >> >> >> regards, >> >> Natxo >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com. >> To view this discussion visit >> https://groups.google.com/d/msgid/golang-nuts/49fb8d6d-9db7-4f62-ab34-8eefdb6e8ad9n%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/49fb8d6d-9db7-4f62-ab34-8eefdb6e8ad9n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- -- Groeten, natxo -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/golang-nuts/CAHBEJzUzJsWBRtHREw%2B5OvQ%2BmaigdAz0A9%2BJDACMYuVGD9JmRw%40mail.gmail.com.