github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/bestpractices/quitchan.go (about) 1 // +build ignore,OMIT 2 3 package main 4 5 import ( 6 "fmt" 7 "net" 8 "time" 9 ) 10 11 // SEND OMIT 12 func sendMsg(msg, addr string) error { 13 conn, err := net.Dial("tcp", addr) 14 if err != nil { 15 return err 16 } 17 defer conn.Close() 18 _, err = fmt.Fprint(conn, msg) 19 return err 20 } 21 22 // BROADCAST OMIT 23 func broadcastMsg(msg string, addrs []string) error { 24 errc := make(chan error) 25 quit := make(chan struct{}) 26 27 defer close(quit) 28 29 for _, addr := range addrs { 30 go func(addr string) { 31 select { 32 case errc <- sendMsg(msg, addr): 33 fmt.Println("done") 34 case <-quit: 35 fmt.Println("quit") 36 } 37 }(addr) 38 } 39 40 for _ = range addrs { 41 if err := <-errc; err != nil { 42 return err 43 } 44 } 45 return nil 46 } 47 48 // MAIN OMIT 49 func main() { 50 addr := []string{"localhost:8080", "http://google.com"} 51 err := broadcastMsg("hi", addr) // HL 52 53 time.Sleep(time.Second) 54 55 if err != nil { 56 fmt.Println(err) 57 return 58 } 59 fmt.Println("everything went fine") 60 }