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  }