我無法弄清楚為什么該方法需要您專門提供緩沖通道。從文檔中,func (*Client) 去func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *CallGo 異步調用函數。它返回表示調用的 Call 結構。done 通道將通過返回相同的 Call 對象在調用完成時發出信號。如果 done 為 nil,Go 將分配一個新通道。如果非零,done 必須被緩沖,否則 Go 會故意崩潰。
1 回答

白板的微信
TA貢獻1883條經驗 獲得超3個贊
LeGEC 在他們的評論中提到了這一點。
進一步挖掘,您會在 client.go 中找到這一點
func (call *Call) done() {
select {
case call.Done <- call:
// ok
default:
// We don't want to block here. It is the caller's responsibility to make
// sure the channel has enough buffer space. See comment in Go().
if debugLog {
log.Println("rpc: discarding Call reply due to insufficient Done chan capacity")
}
}
}
從這里你可以看到,庫期望調用是完全異步的。這意味著完成通道必須有足夠的容量來完全解耦兩個進程(即完全沒有阻塞)。
此外,當使用 select 語句時,它是執行非阻塞通道操作的慣用方式。
- 1 回答
- 0 關注
- 150 瀏覽
添加回答
舉報
0/150
提交
取消