Расширение интерфейсов в Go

Довольно новый идти. Я пытаюсь изменить эту реализацию сервера go scribe:

https://github.com/samuel/go-thrift/blob/master/examples/scribe_server/main.go

Я хотел бы передать канал в функцию Log(), чтобы я мог передавать данные писца в отдельную процедуру go, но я не уверен, как изменить scribe/thrift.go, чтобы расширить интерфейс журнала, чтобы он

Log(messages []*scribe.LogEntry, counts chan string)  

(или нужно ли это вообще и есть ли способ расширить интерфейс, не связываясь с исходной библиотекой).


person David    schedule 13.12.2013    source источник


Ответы (1)


Вы не можете изменить или расширить уже объявленный интерфейс, вы можете только создать новый, возможно расширив старый. Но вы не можете повторно объявлять методы в интерфейсе.

Это означает, что то, что вы хотите сделать (изменить интерфейс Scribe, чтобы его метод Log имел другую сигнатуру), невозможно.

Что вы можете сделать, так это иметь тип, который содержит ваш канал и встраивает структуру, которую вы хотите расширить. .

Пример:

type Scribe interface {
    Log(Messages []*LogEntry) (ResultCode, error)
}

type ModifiedScribe struct {
    Scribe
    counts chan string
}

func (m *ModifiedScribe) Log(Messages []*LogEntry) (ResultCode, error) {
    // do something with m.counts

    // call embedded implementation's Log message
    return m.Scribe.Log(Messages)
}

В приведенном выше примере определяется структура, которая включает Scribe и определяет свой собственный метод Log, используя один из встроенных Scribe. Эту структуру можно использовать везде, где ожидается Scribe (поскольку она реализует интерфейс Scribe), но она содержит дополнительный канал.

person nemo    schedule 13.12.2013