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