В Go нет наследования; композиция через встраивание структур (embedding) и интерфейсы. Поведение переиспользуют, включая типы в структуру и вызывая их методы; при необходимости переопределяют методы. Предпочитают маленькие интерфейсы и композицию больших типов из маленьких. Не эмулировать иерархии классов; использовать интерфейсы и внедрение зависимостей.
type Handler struct {
Logger Logger
Metrics Metrics
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
h.Logger.Info("request")
h.next.ServeHTTP(w, r)
}