El canal Golang no se cerró.
Soy bastante nuevo en el canal Go especialmente. Intenté cerrar un canal pero no se cerró, creando así el método
fmt.Println("transaksi finaly done")
y
fmt.Println("order finaly done")
El programa no me llamó, ¿qué hice mal para exactamente?
código completo
func (u *Usecase) GetOrderDetailByIDUsecase(ctx context.Context, orderId uint64) (*order.OrderPageDetailResponseDTO, error) {
var wg sync.WaitGroup
runtime.GOMAXPROCS(2)
orderCh := make(chan *order.OrderResponseDTO)
transaksiCh := make(chan *transaksi.TransaksiResponseDTO)
errCh := make(chan error, 2)
wg.Add(1)
go func() {
fmt.Println("order start")
orderResp, err := u.orderController.GetOrderByID(ctx, orderId)
fmt.Println("order done")
errCh <- err
orderCh <- orderResp
fmt.Println("transaksi finaly done")
wg.Done()
}()
wg.Add(1)
go func() {
fmt.Println("transaksi start")
transaksiResp, err := u.transaksiController.GetTransaksiByID(ctx, int64(orderId))
fmt.Println("transaksi done")
errCh <- err
transaksiCh <- transaksiResp
fmt.Println("transaksi finaly done")
wg.Done()
}()
go func() {
wg.Wait()
close(errCh)
close(orderCh)
close(transaksiCh)
}()
for err := range errCh {
if err != nil {
return nil, err
}
}
var orderResp *order.OrderResponseDTO
var transaksiResp *transaksi.TransaksiResponseDTO
select {
case orderResp = <-orderCh:
case transaksiResp = <-transaksiCh:
}
return &order.OrderPageDetailResponseDTO{
Order: orderResp,
Transaksi: transaksiResp,
}, nil
}
Aceptado
Sus rutinas de "productor" están bloqueadas en orderCh
y transaksiCh
. Como no les diste un tamaño en la llamada a make
, la escritura se bloqueará hasta que alguien esté listo para leerla. La misma rutina que lee esos canales espera a que errCh
se cierre, pero eso depende de que las rutinas del productor terminen debido a su WaitGroup
.