第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模板對象字段強制執(zhí)行

模板對象字段強制執(zhí)行

Go
qq_笑_17 2021-12-06 16:56:19
Go 提供了很好的 HTML 模板功能,但是對我來說,確保某些字段始終可用于我的應用程序中的模板是很重要的。一個很好的例子是標題字段,它需要顯示在每個 HTML 頁面上。鑒于以下頁面:HomeRegisterContact我可能會為模板系統(tǒng)創(chuàng)建以下對象:HomePagestructRegisterPagestructContactPagestruct是否有推薦的方法來確保每個頁面的結構都有可用的某些字段?理想情況下,我會通過多態(tài)來實現(xiàn)這一點,但這在 Go 中并未得到官方支持。另一種選擇,嵌入不會出現(xiàn)任何強制執(zhí)行,即所有子結構的可嵌入父結構,但不必須。如果我沒有足夠清楚地表達我的問題,請告訴我。
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經(jīng)驗 獲得超6個贊

執(zhí)行模板不強制任何參數(shù),Template.Execute()接受類型的值interface{}。


您是創(chuàng)建HomePage,RegisterPage和ContactPage結構的人。是什么阻止您嵌入BasePage具有所需字段的結構?你擔心你會忘記它嗎?你會在第一次測試時注意到它,我不會擔心:


type BasePage struct {

    Title string

    Other string

    // other required fields...

}


type HomePage struct {

    BasePage

    // other home page fields...

}


type RegisterPage struct {

    BasePage

    // other register page fields...

}

如果您想從代碼中檢查頁面結構是否嵌入了BasePage,我推薦另一種方法:接口。


type HasBasePage interface {

    GetBasePage() BasePage

}

HomePage實現(xiàn)它的示例:


type HomePage struct {

    BasePage

    // other home page fields...

}


func (h *HomePage) GetBasePage() BasePage {

    return h.BasePage

}

現(xiàn)在顯然只有具有GetBasePage()方法的頁面才能作為值傳遞HasBasePage:


var page HasBasePage = &HomePage{} // Valid, HomePage implements HasBasePage

如果你不想使用接口,你可以使用reflect包來檢查一個值是否是一個結構值,以及它是否嵌入了另一個接口。嵌入的結構出現(xiàn)并且可以像普通字段一樣訪問,例如 with Value.FieldByName(),類型名稱是字段名稱。


reflect用于檢查值是否嵌入的示例代碼BasePage:


page := &HomePage{BasePage: BasePage{Title: "Home page"}}


v := reflect.ValueOf(page)

if v.Kind() == reflect.Ptr {

    v = v.Elem()

}

if v.Kind() != reflect.Struct {

    fmt.Println("Error: not struct!")

    return

}

bptype := reflect.TypeOf(BasePage{})

bp := v.FieldByName(bptype.Name()) // "BasePage"

if !bp.IsValid() || bp.Type() != bptype {

    fmt.Println("Error: struct does not embed BasePage!")

    return

}


fmt.Printf("%+v", bp)

輸出(在 上嘗試Go Playground):


{Title:Home page Other:}


查看完整回答
反對 回復 2021-12-06
  • 1 回答
  • 0 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號