package main import ( "fmt" "sync" "time" ) func main() { ch1 := make(chan interface{}) ch2 := make(chan interface{}) ch3 := make(chan interface{}) wg := &sync.WaitGroup{} wg.Add(3) go func() { data := <-ch1 time.Sleep(time.Second * 2) defer wg.Done() fmt.Println("Hi I have run First with", data) output := fmt.Sprint("Outout 1") defer close(ch1) ch2 <- output }() go func() { data := <-ch2 time.Sleep(time.Second * 3) fmt.Println("Hi I have run Second with", data) output := "Output 2" defer close(ch2) ch3 <- output defer wg.Done() }() go func() { data := <-ch3 time.Sleep(time.Second * 4) defer close(ch3) fmt.Println("Hi I have run Third with", data) defer wg.Done() }() ch1 <- "First Raw Data" wg.Wait() }