El canal Golang no se cerró.

Resuelto farhandika zahrir asked hace 10 meses • 1 respuestas

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
}
farhandika zahrir avatar Feb 16 '24 19:02 farhandika zahrir
Aceptado

Sus rutinas de "productor" están bloqueadas en orderChy 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 errChse cierre, pero eso depende de que las rutinas del productor terminen debido a su WaitGroup.

Stephen Newell avatar Feb 16 '2024 12:02 Stephen Newell