Я хочу знать, что здесь происходит.Функциональный интерфейс реализации
Существует интерфейс для обработчика HTTP:
type Handler interface {
ServeHTTP(*Conn, *Request)
}
Эта реализация я думаю, я понимаю.
type Counter int
func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) {
fmt.Fprintf(c, "counter = %d\n", ctr);
ctr++;
}
От моего понимания, что тип «Счетчик» реализует интерфейс, поскольку он имеет метод, который имеет требуемую подпись. Все идет нормально. Затем дается следующий пример:
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");
}
// Now we define a type to implement ServeHTTP:
type HandlerFunc func(*Conn, *Request)
func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) {
f(c, req) // the receiver's a func; call it
}
// Convert function to attach method, implement the interface:
var Handle404 = HandlerFunc(notFound);
Может ли кто-нибудь уточнить, почему и как эти различные функции подходят друг другу?
Хорошо, я думаю, что я понял, что меня сбило с толку, это преобразование notFound в HandlerFunc. После перечитывания раздела конверсий эффективного перехода более ясно, как это может также относиться к функциям. http://golang.org/doc/effective_go.html#conversions – mbarkhau