首頁 >後端開發 >Golang >在 Go 中使用 Map 時如何存取 HTML 範本中的結構體欄位?

在 Go 中使用 Map 時如何存取 HTML 範本中的結構體欄位?

Susan Sarandon
Susan Sarandon原創
2024-10-24 07:43:29629瀏覽

How to Access Struct Fields in HTML Templates when Using Maps in Go?

使用Go 的html/template 存取HTML 範本中的結構體欄位

在Go 的html/template 套件中,存取儲存的結構體欄位時可能會遇到挑戰作為地圖中的值。本文提供了此問題的解決方案,使您能夠檢索並顯示模板中結構體的各個欄位。

考慮以下範例,其中我們定義了一個Task 結構體:

<code class="go">type Task struct {
   Cmd string
   Args []string
   Desc string
}</code>

我們使用Task 結構體作為值,字串作為鍵來初始化一個映射:

<code class="go">var taskMap = map[string]Task{
    "find": Task{
        Cmd: "find",
        Args: []string{"/tmp/"},
        Desc: "find files in /tmp dir",
    },
    "grep": Task{
        Cmd: "grep",
        Args: []string{"foo", "/tmp/*", "-R"},
        Desc: "grep files match having foo",
    },
}</code>

現在,我們想要使用html/template 使用taskMap 資料來解析HTML 頁面:

<code class="go">func listHandle(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("index.tmpl")
    t.Execute(w, taskMap)
}</code>

這是對應的模板,index.tmpl:

<code class="html"><html>
{{range $k, $v := .}}
   <li>Task Name: {{$k}}</li>
   <li>Task Value: {{$v}}</li>
   <li>Task Description: {{$v.Desc}}</li>
{{end}}
</html></code>

雖然從映射中存取$k 和$v 變數按預期工作,但使用{{$v.Desc}} 存取Desc 欄位失敗。為了解決這個問題,我們需要確保在匯出範本中要存取的欄位。在 Go 中,欄位以大寫字母開頭時會被匯出。

解決方案:

修改Task 結構體以匯出Desc 欄位:

<code class="go">type Task struct {
   Cmd string
   Args []string
   Desc string
}</code>

更新映射使用匯出的Desc 欄位:

<code class="go">var taskMap = map[string]Task{
    "find": Task{
        Cmd: "find",
        Args: []string{"/tmp/"},
        Desc: "find files in /tmp dir",
    },
    "grep": Task{
        Cmd: "grep",
        Args: []string{"foo", "/tmp/*", "-R"},
        Desc: "grep files match having foo",
    },
}</code>

更新映射使用匯出的Desc 欄位:

<code class="html">{{range $k, $v := .}}
   <li>Task Name: {{$k}}</li>
   <li>Task Value: {{$v}}</li>
   <li>Task Description: {{$v.Desc}}</li>
{{end}}</code>

在模板中,更新語法以引用導出的Desc 字段:透過執行以下步驟,您將能夠存取HTML 模板中的結構字段,使您可以輕鬆顯示並利用儲存在Go 地圖中的數據。

以上是在 Go 中使用 Map 時如何存取 HTML 範本中的結構體欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn