func doEchoStream(client simple.SimpleClient, num int) { log.Printf("EchoStream: %v", num) stream, err := client.EchoStream(context.Background()) if err != nil { log.Printf("Failed EchoStream: %v", err) return } done := make(chan struct{}) go func() { defer close(done) for { in, err := stream.Recv() if err == io.EOF { return } if err != nil { log.Printf("Failed EchoStream: %v", err) return } log.Printf("EchoStream received %v", in) } }() defer func() { stream.CloseSend() <-done }() for i := 0; i < num; i++ { if err := stream.Send(&simple.Number{Num: int32(i)}); err != nil { log.Printf("Failed to EchoStream: %v", err) return } } }