Ich versuche, das Problem auf dieser Folie skizzierte zu verstehen:Wie wird dieser chan geleckt?
http://talks.golang.org/2013/bestpractices.slide#27
Kopieren Sie den Code, falls die URL stirbt:
func sendMsg(msg, addr string) error {
conn, err := net.Dial("tcp", addr)
if err != nil {
return err
}
defer conn.Close()
_, err = fmt.Fprint(conn, msg)
return err
}
func broadcastMsg(msg string, addrs []string) error {
errc := make(chan error)
for _, addr := range addrs {
go func(addr string) {
errc <- sendMsg(msg, addr)
fmt.Println("done")
}(addr)
}
for _ = range addrs {
if err := <-errc; err != nil {
return err
}
}
return nil
}
func main() {
addr := []string{"localhost:8080", "http://google.com"}
err := broadcastMsg("hi", addr)
time.Sleep(time.Second)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("everything went fine")
}
Und die Kommentare:
- die goroutine ist auf dem chan gesperrt
- die goroutine enthält einen bezug auf t er chan
- die chan wird Müll nie
gesammelt Ich bin nicht sicher, ob ich verstehen, warum die chan nie oder welche goroutine gesammelt wird ein Verweis auf die chan zu halten. Ihre Zeit ist willkommen!