If you need such sequencing, you might reevaluate your need to use goroutines. However, the way you described the solution is correct:
go first() {
for {
<-ch1
// do stuff
ch2<-struct{}{}
}
}()
go second() {
for {
<-ch2
// do stuff
ch3<-struct{}{}
}
}()
go third() {
for {
<-ch3
// do stuff
ch1<-struct{}{}
}
}()
However, this is a circular setup, and you have to start the first one outside this structure:
go first() {...}()
go second() {...}()
go third() {...} ()
// Start the first one
ch1<-struct{}{}
2
solved How can I overlap goroutines?