if only want signal (without pass value), wait channel close can do the trick:
test code:
package main
import (
"fmt"
"time"
)
func wait_chan(ch <-chan int) {
select {
case val, ok := <-ch: //read OR closed
fmt.Println("- got:", val, ok)
case <-time.After(3 * time.Second):
fmt.Println("- timeout 2")
// default:
// fmt.Println("immediately giveup!")
}
}
func main() {
fmt.Println("Broadcast emulate:")
c2 := make(chan int, 1)
go wait_chan(c2)
go wait_chan(c2)
go wait_chan(c2)
// c2 <- 22 // ok: true , one recv
// close(c2) // ok: false, all recv
time.Sleep(1 * time.Second)
close(c2)
time.Sleep(1 * time.Second)
fmt.Println("Finish.")
}
output:
Broadcast emulate:
- got: 0 false
- got: 0 false
- got: 0 false
Finish.