Интерфейс реализации функции

Определенно Ваш Sinclair. Передает.

11
задан hannson 19 March 2010 в 16:20
поделиться

2 ответа

Это:

type Handler interface {
    ServeHTTP(*Conn, *Request)
}

говорит, что любой тип, удовлетворяющий интерфейсу Handler , должен иметь метод ServeHTTP . Вышеупомянутое будет внутри пакета http .

type Counter int

func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
    fmt.Fprintf(c, "counter = %d\n", ctr);
    ctr++;
}

Это помещает метод в тип Counter, который соответствует ServeHTTP. Это пример, который отличается от следующего.

Насколько я понимаю, тип «Счетчик» реализует интерфейс, поскольку у него есть метод, имеет требуемую подпись.

Верно.

Следующая функция сама по себе не будет работать как Обработчик :

func notFound(c *Conn, req *Request) {
    c.SetHeader("Content-Type", "text/plain;", "charset=utf-8");
    c.WriteHeader(StatusNotFound);
    c.WriteString("404 page not found\n");
}

Остальная часть этого материала просто соответствует описанному выше, так что она может быть обработчиком .

Далее HandlerFunc - это функция, которая принимает два аргумента: указатель на Conn и указатель на Запрос и ничего не возвращает. Другими словами, любая функция, которая принимает эти аргументы и ничего не возвращает, может быть HandlerFunc .

// Now we define a type to implement ServeHTTP:
type HandlerFunc func(*Conn, *Request)

Здесь ServeHTTP - это метод, добавленный к типу HandlerFunc :

func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
    f(c, req) // the receiver's a func; call it
}

Все, что он делает, это вызывает саму функцию ( f ) с заданными аргументами.

// Convert function to attach method, implement the interface:
var Handle404 = HandlerFunc(notFound);

В строке выше notFound оказался приемлемым для интерфейса для Handler путем искусственного создания экземпляра типа из самой функции и превращения функции в метод ServeHTTP для экземпляр. Теперь Handle404 можно использовать с интерфейсом Handler . По сути, это своего рода трюк.

14
ответ дан 3 December 2019 в 08:04
поделиться

Что именно вы не понимаете во второй половине? Это тот же образец, что и выше. Вместо того, чтобы определять тип Counter как int, они определяют функцию notFound. Затем они создают тип функции под названием HandlerFunc, который принимает два параметра: соединение и запрос. Затем они создают новый метод ServeHTTP, который привязывается к типу HandlerFunc. Handle404 - это просто экземпляр этого класса, который использует функцию notFound.

1
ответ дан 3 December 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: