問題
authboss ( https://github.com/volatiletech/authboss ) を quicktemplate ( https://github.com/valyala/quicktemplate ) で使用しようとしています。
authboss レンダリング システムは、 Rendererという1 つのインターフェースによって定義されます。
ソリューションの 2 つの異なるバージョンを作成しましたが、どちらが最適か、または 3 つ目のバージョンが優れているかどうかを知りたいです。
https://github.com/frederikhors/authbossQuicktemplate_1、ファクトリ パターンと初期化子を使用
https://github.com/frederikhors/authbossQuicktemplate_2、インターフェイスと
SetData(data authboss.HTMLData) (page PageImpl)
メソッドを使用
質問
パフォーマンスのために何を改善すればよいかわかりません。
ハードウェア リソースの観点から、同じことを別の方法で行うことは可能ですか?
どこかでポインターを使用して改善できると思いますか?
関連コード
Factory パターンと初期化子を使用したソリューション:
type HTML struct { templates map[string]func(authboss.HTMLData) templates.PageImpl } func (h *HTML) Load(names ...string) error { for _, n := range names { switch n { case "login": h.templates[n] = InitializeLoginPage case "recover": h.templates[n] = InitializeRecoverPage } } return nil } func (h *HTML) Render(ctx context.Context, page string, data authboss.HTMLData) (output []byte, contentType string, err error) { buf := &bytes.Buffer{} tpl, ok := h.templates[page] if !ok { return nil, "", errors.Errorf("template for page %s not found", page) } templates.WritePage(buf, tpl(data)) return buf.Bytes(), "text/html", nil } func InitializeLoginPage(data authboss.HTMLData) templates.PageImpl { return &templates.LoginPage{Data: data} } func InitializeRecoverPage(data authboss.HTMLData) templates.PageImpl { return &templates.RecoverPage{Data: data} }
メソッドとのインターフェースを持つソリューション
type HTML struct { templates map[string]templates.AuthPageImpl } func (h *HTML) Load(names ...string) error { for _, n := range names { switch n { case "login": h.templates[n] = &templates.LoginPage{} case "recover": h.templates[n] = &templates.RecoverPage{} } } return nil } func (h *HTML) Render(ctx context.Context, page string, data authboss.HTMLData) (output []byte, contentType string, err error) { buf := &bytes.Buffer{} tpl, ok := h.templates[page] if !ok { return nil, "", errors.Errorf("template for page %s not found", page) } template := tpl.SetData(data) templates.WritePage(buf, template) return buf.Bytes(), "text/html", nil } type AuthPageImpl interface { SetData(data authboss.HTMLData) PageImpl } type LoginPage struct { Data authboss.HTMLData } type RecoverPage struct { Data authboss.HTMLData } func (p *LoginPage) SetData(data authboss.HTMLData) (page PageImpl) { p.Data = data return p } func (p *RecoverPage) SetData(data authboss.HTMLData) PageImpl { p.Data = data return p }