婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go html/template 模板的使用實例詳解

Go html/template 模板的使用實例詳解

熱門標簽:高德地圖標注口訣 浙江高速公路地圖標注 江西轉化率高的羿智云外呼系統 地圖標注的汽車標 西部云谷一期地圖標注 學海導航地圖標注 廣州呼叫中心外呼系統 中國地圖標注省會高清 南通如皋申請開通400電話

從字符串載入模板

我們可以定義模板字符串,然后載入并解析渲染:

template.New(tplName string).Parse(tpl string)

// 從字符串模板構建
tplStr := `
  {{ .Name }} {{ .Age }}
`
// if parse failed Must will render a panic error
tpl := template.Must(template.New("tplName").Parse(tplStr))
tpl.Execute(os.Stdout, map[string]interface{}{Name: "big_cat", Age: 29})

從文件載入模板

模板語法

模板文件,建議為每個模板文件顯式的定義模板名稱: {{ define "tplName" }} ,否則會因模板對象名與模板名不一致,無法解析(條件分支很多,不如按一種標準寫法實現),另展示一些基本的模板語法。

  • 使用 {{ define "tplName" }} 定義模板名
  • 使用 {{ template "tplName" . }} 引入其他模板
  • 使用 . 訪問當前數據域:比如 range 里使用 . 訪問的其實是循環項的數據域
  • 使用 $. 訪問絕對頂層數據域

views/header.html

{{ define "header" }}
!doctype html>
html lang="en">
head>
  meta charset="UTF-8">
  meta name="viewport"
     content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  meta http-equiv="X-UA-Compatible" content="ie=edge">
  title>{{ .PageTitle }}/title>
/head>
{{ end }}
views/footer.html
{{ define "footer" }}
/html>
{{ end }}

views/index/index.html

{{ define "index/index" }}
  {{/*引用其他模板 注意后面的 . */}}
  {{ template "header" . }}
  body>
  div>
    hello, {{ .Name }}, age {{ .Age }}
  /div>
  /body>
  {{ template "footer" . }}
{{ end }}

views/news/index.html

{{ define "news/index" }}
  {{ template "header" . }}
  body>
  {{/* 頁面變量定義 */}}
  {{ $pageTitle := "news title" }}
  {{ $pageTitleLen := len $pageTitle }}
  {{/* 長度 > 4 才輸出 eq ne gt lt ge le */}}
  {{ if gt $pageTitleLen 4 }}
    h4>{{ $pageTitle }}/h4>
  {{ end }}

  {{ $c1 := gt 4 3}}
  {{ $c2 := lt 2 3 }}
  {{/*and or not 條件必須為標量值 不能是邏輯表達式 如果需要邏輯表達式請先求值*/}}
  {{ if and $c1 $c2 }}
    h4>1 == 1 3 > 2 4  5/h4>
  {{ end }}

  div>
    ul>
      {{ range .List }}
        {{ $title := .Title }}
        {{/* .Title 上下文變量調用  func param1 param2 方法/函數調用  $.根節點變量調用 */}}
        li>{{ $title }} -- {{ .CreatedAt.Format "2006-01-02 15:04:05" }} -- Author {{ $.Author }}/li>
      {{end}}
    /ul>
    {{/* !empty Total 才輸出*/}}
    {{ with .Total }}
      div>總數:{{ . }}/div>
    {{ end }}
  /div>
  /body>
  {{ template "footer" . }}
{{ end }}

template.ParseFiles

手動定義需要載入的模板文件,解析后制定需要渲染的模板名 news/index 。

// 從模板文件構建
tpl := template.Must(
  template.ParseFiles(
    "views/index/index.html",
    "views/news/index.html",
    "views/header.html",
    "views/footer.html",
  ),
)

// render template with tplName index
_ = tpl.ExecuteTemplate(
  os.Stdout,
  "index/index",
  map[string]interface{}{
    PageTitle: "首頁",
    Name: "big_cat",
    Age: 29,
  },
)
// render template with tplName index
_ = tpl.ExecuteTemplate(
  os.Stdout,
  "news/index",
  map[string]interface{}{
    "PageTitle": "新聞",
    "List": []struct {
      Title   string
      CreatedAt time.Time
    }{
      {Title: "this is golang views/template example", CreatedAt: time.Now()},
      {Title: "to be honest, i don't very like this raw engine", CreatedAt: time.Now()},
    },
    "Total": 1,
    "Author": "big_cat",
  },
)

template.ParseGlob

手動的指定每一個模板文件,在一些場景下難免難以滿足需求,我們可以使用通配符正則匹配載入。

1、正則不應包含文件夾,否則會因文件夾被作為視圖載入無法解析而報錯

2、可以設定多個模式串,如下我們載入了一級目錄和二級目錄的視圖文件

// 從模板文件構建
tpl := template.Must(template.ParseGlob("views/*.html"))
template.Must(tpl.ParseGlob("views/*/*.html"))
// render template with tplName index
// render template with tplName index
_ = tpl.ExecuteTemplate(
  os.Stdout,
  "index/index",
  map[string]interface{}{
    PageTitle: "首頁",
    Name: "big_cat",
    Age: 29,
  },
)
// render template with tplName index
_ = tpl.ExecuteTemplate(
  os.Stdout,
  "news/index",
  map[string]interface{}{
    "PageTitle": "新聞",
    "List": []struct {
      Title   string
      CreatedAt time.Time
    }{
      {Title: "this is golang views/template example", CreatedAt: time.Now()},
      {Title: "to be honest, i don't very like this raw engine", CreatedAt: time.Now()},
    },
    "Total": 1,
    "Author": "big_cat",
  },
)

Web服務器

結合模板庫和 Gin 實現一個可以使用模板渲染并返回 html 頁面的 web 服務。

package main

import (
  "html/template"
  "log"
  "net/http"
  "time"
)

var (
  htmlTplEngine  *template.Template
  htmlTplEngineErr error
)

func init() {
  // 初始化模板引擎 并加載各層級的模板文件
  // 注意 views/* 不會對子目錄遞歸處理 且會將子目錄匹配 作為模板處理造成解析錯誤
  // 若存在與模板文件同級的子目錄時 應指定模板文件擴展名來防止目錄被作為模板文件處理
  // 然后通過 view/*/*.html 來加載 view 下的各子目錄中的模板文件
  htmlTplEngine = template.New("htmlTplEngine")

  // 模板根目錄下的模板文件 一些公共文件
  _, htmlTplEngineErr = htmlTplEngine.ParseGlob("views/*.html")
  if nil != htmlTplEngineErr {
    log.Panic(htmlTplEngineErr.Error())
  }
  // 其他子目錄下的模板文件
  _, htmlTplEngineErr = htmlTplEngine.ParseGlob("views/*/*.html")
  if nil != htmlTplEngineErr {
    log.Panic(htmlTplEngineErr.Error())
  }

}

// index
func IndexHandler(w http.ResponseWriter, r *http.Request) {
  _ = htmlTplEngine.ExecuteTemplate(
    w,
    "index/index",
    map[string]interface{}{"PageTitle": "首頁", "Name": "sqrt_cat", "Age": 25},
  )
}

// news
func NewsHandler(w http.ResponseWriter, r *http.Request) {
  _ = htmlTplEngine.ExecuteTemplate(
    w,
    "news/index",
    map[string]interface{}{
      "PageTitle": "新聞",
      "List": []struct {
        Title   string
        CreatedAt time.Time
      }{
        {Title: "this is golang views/template example", CreatedAt: time.Now()},
        {Title: "to be honest, i don't very like this raw engine", CreatedAt: time.Now()},
      },
      "Total": 1,
      "Author": "big_cat",
    },
  )
}

func main() {
  http.HandleFunc("/", IndexHandler)
  http.HandleFunc("/index", IndexHandler)
  http.HandleFunc("/news", NewsHandler)

  serverErr := http.ListenAndServe(":8085", nil)

  if nil != serverErr {
    log.Panic(serverErr.Error())
  }
}

注意 :模板對象是有名字屬性的, template.New("tplName") ,如果沒有顯示的定義名字,則會使用第一個被載入的視圖文件的 baseName 做默認名,比如我們使用 template.ParseFiles/template.ParseGlob 直接生成模板對象時,沒有指定模板對象名,則會使用第一個被載入的文件,比如 views/index/index.html 的 baseName 即 index.html 做默認名,而后如果 tplObj.Execute 方法執行渲染時,會去查找名為 index.html 的模板,所以常用的還是 tplObj.ExecuteTemplate 自己指定要渲染的模板名,省的一團亂。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang模板template自定義函數用法示例

標簽:東營 吐魯番 常州 保定 貴州 許昌 德宏 曲靖

巨人網絡通訊聲明:本文標題《Go html/template 模板的使用實例詳解》,本文關鍵詞  html,template,模板,的,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go html/template 模板的使用實例詳解》相關的同類信息!
  • 本頁收集關于Go html/template 模板的使用實例詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产91精品精华液一区二区三区| av中文字幕在线不卡| 久久青草欧美一区二区三区| 欧美日本不卡视频| 久久久久久免费| 久久亚洲私人国产精品va媚药| 亚洲视频 欧洲视频| 国产精品成人午夜| 亚洲午夜视频在线| 亚洲一级二级在线| 久久久一区二区三区| 欧美大片国产精品| 国产女人18毛片水真多成人如厕| 亚洲国产欧美在线人成| 日韩精品一区在线| 成人a区在线观看| 亚洲h在线观看| 91美女在线视频| 91精品国产综合久久久蜜臀粉嫩| 亚洲亚洲人成综合网络| 美日韩黄色大片| 亚洲乱码中文字幕| 亚洲国产婷婷综合在线精品| 欧美日韩二区三区| av不卡在线播放| 狠狠色丁香九九婷婷综合五月| 成人精品国产福利| 精品国产一区二区三区忘忧草| 国产精品久久久久影院亚瑟| 亚洲蜜臀av乱码久久精品| 国产亚洲自拍一区| 欧美人与禽zozo性伦| 国内成人免费视频| 亚洲精品综合在线| 日本一区二区视频在线| 国产成人在线视频网站| 精品一二三四在线| 秋霞影院一区二区| 成人激情电影免费在线观看| 久久99精品国产91久久来源| 麻豆91精品91久久久的内涵| 三级久久三级久久久| 国产99久久久国产精品免费看| 精品粉嫩超白一线天av| 激情文学综合插| 日本女人一区二区三区| 91欧美激情一区二区三区成人| 91国偷自产一区二区三区观看| 亚洲少妇中出一区| 欧美视频一区二区| 欧美三区在线视频| 欧美年轻男男videosbes| 成人国产在线观看| 波多野结衣一区二区三区 | 91麻豆精品国产91久久久资源速度| 亚洲国产裸拍裸体视频在线观看乱了| 美国三级日本三级久久99| 五月天久久比比资源色| 色拍拍在线精品视频8848| 一本色道久久加勒比精品| 国精产品一区一区三区mba视频| 自拍偷自拍亚洲精品播放| 国产成人免费视频网站 | 欧美国产日韩亚洲一区| 色美美综合视频| 欧美日韩国产一区二区三区地区| 成人av免费在线播放| 欧美成人官网二区| 欧美无砖专区一中文字| 天天综合色天天综合| 日韩亚洲欧美中文三级| 尤物在线观看一区| 国产乱妇无码大片在线观看| 国产免费成人在线视频| 久久精品夜色噜噜亚洲a∨| 美女精品一区二区| 成人性生交大片| 国产精品一区二区久久不卡| 成人av网址在线| 国产乱码精品1区2区3区| 久久久久国产精品麻豆| 亚洲一区二区精品视频| 麻豆精品一区二区综合av| 99久久国产综合精品女不卡| 7777精品伊人久久久大香线蕉经典版下载| 欧美二区三区的天堂| 日本vs亚洲vs韩国一区三区 | 国产精品欧美久久久久无广告| 午夜精品久久久久久久99水蜜桃| 国内久久精品视频| 久久众筹精品私拍模特| 岛国一区二区三区| 亚洲第一成人在线| 久久久久久亚洲综合影院红桃| 日韩亚洲欧美中文三级| 久久亚洲一区二区三区四区| 日韩女优毛片在线| 久久综合久久99| 亚洲欧美日韩国产成人精品影院| 欧美日韩精品欧美日韩精品一| 午夜精品久久久久久久久久| 中日韩免费视频中文字幕| 亚洲综合久久久久| 色婷婷综合激情| 国产传媒欧美日韩成人| 久久久久久免费毛片精品| 在线视频中文字幕一区二区| 蜜桃视频免费观看一区| 亚洲欧美激情插| 欧美欧美欧美欧美首页| 亚洲伦在线观看| 国产91高潮流白浆在线麻豆| 精品久久久久久久久久久久包黑料| 欧美日韩亚洲综合一区二区三区| 欧美一区二区成人| 色综合一区二区| 国产亚洲一区二区三区四区| 国产精品白丝av| 亚洲欧洲精品一区二区三区| 日本一二三四高清不卡| 久久激情五月婷婷| 国产欧美一区二区精品秋霞影院 | 九色|91porny| 欧美激情一区二区三区在线| 1024亚洲合集| 成人亚洲精品久久久久软件| 久久夜色精品国产欧美乱极品| 亚洲色图.com| 自拍视频在线观看一区二区| 中文字幕免费不卡在线| 色婷婷久久综合| 亚洲.国产.中文慕字在线| 一本色道综合亚洲| 精品亚洲成a人在线观看| 精品对白一区国产伦| 日本在线不卡视频| 成人国产精品免费网站| 亚洲精品欧美综合四区| 91精品国产一区二区三区| av色综合久久天堂av综合| 国产美女一区二区三区| 国产精品欧美精品| 激情图片小说一区| 一区二区三区在线视频免费| 欧美婷婷六月丁香综合色| 精品亚洲欧美一区| 日本一区二区电影| 一本久道久久综合中文字幕| 九九精品视频在线看| 久久99国产乱子伦精品免费| 日韩va欧美va亚洲va久久| 尤物av一区二区| 欧美国产日产图区| 国产亚洲制服色| 国产精品短视频| 日本一区二区三区四区在线视频| 成人91在线观看| 国产91精品精华液一区二区三区| 亚洲在线观看免费| 欧美绝品在线观看成人午夜影视| 久久国产成人午夜av影院| 免费成人美女在线观看.| 日本中文字幕一区| 激情国产一区二区 | 99精品视频一区二区三区| 成人激情黄色小说| 欧美三级电影精品| 这里只有精品视频在线观看| 2欧美一区二区三区在线观看视频| 国产精品美女久久久久久久网站| 国产麻豆视频一区| 成人av网址在线| 香蕉久久一区二区不卡无毒影院 | 亚洲男人天堂一区| 亚洲综合一区二区精品导航| 亚洲精品中文字幕乱码三区| 亚洲综合色在线| 美女网站色91| 国产成人av电影免费在线观看| 欧美韩国日本一区| 亚洲素人一区二区| 肉色丝袜一区二区| 91精品国产全国免费观看| 国产在线视视频有精品| 成人高清免费观看| 日本高清视频一区二区| 在线播放欧美女士性生活| 26uuu精品一区二区 | 色综合中文字幕国产 | 成人激情综合网站| 欧美专区在线观看一区| 精品日韩一区二区三区| 国产精品人妖ts系列视频| 国产日韩欧美制服另类| 亚洲电影一级片| 国产.精品.日韩.另类.中文.在线.播放| 偷拍亚洲欧洲综合| 成人在线视频一区二区| 911精品国产一区二区在线| 久久久影视传媒|