Golang 通道没有关闭

问题描述 投票:0回答:1

我对 go 尤其是频道还很陌生。我试图关闭一个通道,但它没有关闭,从而制定了方法

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
}
go channel
1个回答
0
投票

你的“生产者”goroutine 在

orderCh
transaksiCh
上被阻塞。由于您没有在调用
make
时给它们指定大小,因此写入将被阻塞,直到有人准备好读取它为止。读取这些通道的同一个 goroutine 等待
errCh
关闭,但这取决于生产者 goroutine 由于您的
WaitGroup
而完成。

© www.soinside.com 2019 - 2024. All rights reserved.