# #go
Вопрос:
в структуру был добавлен интерфейс.
type contextableStream struct {
grpc.ClientStream
recvTimeout, sendTimeout time.Duration
}
func NewContextableStream(stream grpc.ClientStream, recvTimeout, sendTimeout time.Duration) *contextableStream {
return amp;contextableStream{
ClientStream: stream,
recvTimeout: recvTimeout,
sendTimeout: sendTimeout,
}
}
Эти методы ClientStream
могут быть использованы.
func (s *contextableStream) CloseSend() error {
return s.ClientStream.CloseSend()
}
Зачем человек написал такую функцию? Человек не пытался удовлетворить какой-либо интерфейс
Ответ №1:
Короче говоря: встраивание типа интерфейса в структуру неявно удовлетворяет интерфейсу
grpc.ClientStream — как вы определили — это тип интерфейса.
Этот тип интерфейса встроен в тип структуры contextableStream
. Это, по сути, делает ClientStream
анонимное поле структуры contextableStream
анонимным . Кроме того, будучи анонимным полем, оно делает структуру неявно удовлетворяющей интерфейсу — без каких-либо дополнительных определений методов структуры.
NewContextableStream
инициализирует a contextableStream
— присвоение встроенному анонимному полю значения:
func NewContextableStream(stream grpc.ClientStream, ....) *contextableStream {
return amp;contextableStream{
ClientStream: stream, // the parameter stream is now stored in the struct
/* ... */
}
}
это анонимное встроенное значение поля имеет тип grpc.ClientStream
. Для ссылки на него используется имя типа:
s := NewContextableStream(stream, 0, 0) // stream is stored in s
var i grpc.ClientStream
i = s.ClientStream // interface value of type grpc.ClientStream
и в этом интерфейсе есть все методы, определенные в этом интерфейсе, поэтому можно вызвать:
i.CloseSend()
i.SendMsg(...)
i.RecvMsg(...)
В любом из приведенных выше вызовов, по сути, вызывается метод для исходного значения параметра stream
, переданного NewContextableStream
т. е.
stream.CloseSend()