代码之家  ›  专栏  ›  技术社区  ›  farhandika zahrir

Golang通道没有关闭

  •  0
  • farhandika zahrir  · 技术社区  · 1 年前

    我对围棋很陌生,尤其是频道。我试图关闭一个通道,但它没有关闭,因此制定了方法

    fmt.Println("transaksi finaly done")
    

    fmt.Println("order finaly done")
    

    没有被程序调用,我到底做错了什么?

    完整代码

    
    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
    }
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Stephen Newell    1 年前

    你的“制作人”goroutines在上被阻止 orderCh transaksiCh 。因为你在给他们的电话中没有给他们尺码 make ,写入将被阻止,直到有人准备好读取它。读取这些通道的同一个goroutine等待 errCh 结束,但这取决于制片人goroutines都完成了,因为你 WaitGroup .