возврат функции, которая уже унаследована

# #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()