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