func (r *AppGroup) Use(filters ...Middleware) {
	r.mux.Lock()
	defer r.mux.Unlock()
	r.filters = append(r.filters, filters...)
	if len(r.filters) >= math.MaxInt8 {
		panic(ErrTooManyMiddlewares)
	}
}
Use appends new filters to the end of group

TODO: ignore duplicated filters?
package gogo
import (
	"context"
	"math"
	"net/http"
	"net/http/httputil"
	"path"
	"strings"
	"sync"
	"github.com/dolab/gogo/pkgs/gid"
	"github.com/dolab/httpdispatch"
)
type AppGroup struct {
	mux sync.RWMutex
	server  *AppServer
	prefix  string
	filters []Middleware
	handler Handler
}
func NewAppGroup(prefix string, server *AppServer) *AppGroup {
	dispatcher := httpdispatch.New()
	dispatcher.RedirectTrailingSlash = false
	dispatcher.HandleMethodNotAllowed = false  
	dispatcher.NotFound = NewNotFoundHandle(server)
	dispatcher.MethodNotAllowed = NewMethodNotAllowedHandle(server)
	return &AppGroup{
		server:  server,
		prefix:  prefix,
		handler: dispatcher,
	}
}
func (r *AppGroup) NewGroup(prefix string, filters ...Middleware) Grouper {
	r.mux.Lock()
	defer r.mux.Unlock()
	return &AppGroup{
		server:  r.server,
		handler: r.handler,
		prefix:  r.buildPrefix(prefix),
		filters: r.buildMiddlewares(filters...),
	}
}
func (r *AppGroup) SetHandler(handler Handler) {
	r.mux.Lock()
	r.handler = handler
	r.mux.Unlock()
}