Yes.
1. `counter++` happens-before `ch <- struct{}{}`, because in a single goroutine, happens-before is equivalent with lexical statement order
2. `ch <- struct{}{}` happens-before `<-ch` completes, because "A send on a channel happens before the corresponding receive from that channel completes".
3. `<-ch` completion happens-before `fmt.Println(counter)`, again because in a single goroutine, happens-before is equivalent with lexical statement order
Therefore, `counter++` happens-before `fmt.Println(counter)`.