Как задокументировано :
Go вызывает функцию асинхронно.Возвращает структуру Call, представляющую вызов.Готовый канал будет сигнализировать о завершении вызова, возвращая тот же объект Call.Если готово - ноль, Go выделит новый канал.Если не ноль, done должен быть помещен в буфер, или Go будет преднамеренно аварийно завершен.
Это означает, что он выдает команду , но не ожидает ее завершения .
By контраст :
Вызов вызывает именованную функцию, ожидает ее завершения и возвращает статус ошибки.
Ни один из методов не выполняется в goroutine напрямую * - это оставляется в качестве упражнения для вызывающей стороны (поэтому можно привести аргумент, что Go
является неправильным).
Если вы посмотрите на источник к Call
, возможно, это более понятно:
func (client *Client) Call(serviceMethod string, args interface{}, reply
interface{}) error {
call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Done
return call.Error
}
Так что на самом деле Call
является оберткой вокруг Go
, которая ожидает завершения операции, тогда как Go
является базовой функцией, которая оставляет ожидание до вызывающей стороны.
* Очевидно, что в фоновом режиме где-то задействована программа, так как это неблокирующая операция.