http.Handle()
ожидает значение (любое значение), которое реализует http.Handler
, что означает, что он должен иметь метод ServeHTTP()
.
Вы использовали приемник указателя для метода templateHandler.ServeHTTP()
, что означает, что только метод указателя на templateHandler
имеет этот метод, но не метод не указателя templateHandler
.
Спецификация: Наборы методов:
Тип может иметь набор методов , связанный с ним. Набор методов типа интерфейса является его интерфейсом. Набор методов любого другого типа T
состоит из всех методов , объявленных с типом получателя T
. Набор методов соответствующего типа указателя *T
- это набор всех методов, объявленных с помощью приемника *T
или T
(то есть он также содержит набор методов T
).
Тип без указателя имеет методы только с получателями без указателя. Тип указателя имеет методы как с указателями, так и с получателями без указателей.
Ваш метод ServeHTTP()
изменяет приемник, поэтому он должен быть указателем. Но если какой-то другой обработчик не требуется, метод ServeHTTP()
может быть создан с использованием приемника без указателя, и в этом случае вы можете использовать значение без указателя в качестве http.Handler
, как в этом примере:
type myhandler struct{}
func (m myhandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {}
func main() {
// non-pointer struct value implements http.Handler:
http.Handle("/", myhandler{})
}