Go語言template模板語法

Go語言模板語法

文章目錄

  • <center> Go語言模板語法
      • 連接前后端的符號: `{{}}`
      • 注釋
      • 管道(pipeline)
      • 變量
      • 條件判斷
      • range 關鍵字
      • with 關鍵字
      • 比較函數
      • 自定義函數
      • 嵌套模板
      • 模板繼承

連接前后端的符號: {{}}

  • 模板語法都包含在{{}}之中,其中{{.}}中的.表示當前對象.在傳入一個結構體對象時,可以根據"."來訪問結構體的對應字段.如果是復合類型數據,則可以通過{{.FiledName}}來訪問它的字段,FiledName是指對應go代碼中的結構體變量名

  • 偽代碼例子:

    //在html文檔中
    <body><p>Hello {{.Name}}</p><p>Gender {{.Gemder}}</p>	<p>Age {{.Age}}</p>
    </body>//在Go代碼中
    type UserInfo struct{Name stringGender stringAge int
    }
    user := &UserInfo{Name:"李四",Gender: "未知",Age: 24,
    }
    
  • 這樣后端數據就傳輸到前端顯示了


注釋

  • 語法: {{/*注釋內容*/}}
  • 作用: 和其他語言的注釋一致,目的是提升代碼的可閱讀性
  • 注意: 可以進行多行注釋,但是不可以嵌套注釋,并且必須緊貼分界符始止

管道(pipeline)

  • 介紹: 管道是指產生數據的操作,比如"{{.}}" , "{{.Name}}“等,Go語言模板語法中支持使用管道符號”|"鏈接多個指令,用法和UNIX下的管道類似,所以說管道就像一種概念,知道就行了

變量

  • 介紹: 在Action里可以初始化一個變量來捕獲管道的執行結果
    • Action: 在Web開發中,Action通常指代處理HTTP請求的處理程序或函數。當用戶在網頁上執行某個操作(例如點擊按鈕、提交表單)時,相應的Action會被調用來處理請求并執行相應的邏輯操作。
  • 語法:$variable := pipeline
  • 特點: 聲明變量的Action不會產生任何輸出,大概意思是僅僅聲明該變量而沒有對其進行賦值或使用時,程序的輸出不會顯示該變量的值或其他信息。只有在對變量進行賦值并在程序中使用時,才能在輸出中看到相關的內容。

條件判斷

  • 語法:
    • {{if pipeline}} T1 {{end}}
    • {{if pipeline}} T1 {{else}} T0 {{end}}
    • {{if pipeline}} T1 {{else if pipeline}} T0 {{end}}

range 關鍵字

  • 在Go中使用range關鍵字,pipeline的值必須是數組,切片,字典或者通道.
  • 語法:
    • {{range pipeline}} T1 {{end}}
    • {{range pipeline}} T1 {{else}} T0 {{end}}

with 關鍵字

  • with關鍵字和if關鍵字有點類似,"{{with}}"操作僅在傳遞的管道不為空時有條件地執行其主體
  • 語法:
    • {{with pipeline}} T1 {{end}}
    • {{with pipeline}} T1 {{else}} T0 {{end}}

比較函數

符號作用
eq==
ne!=
lt<
le<=
gt>
ge>=
  • 特點: 只有eq符號可以接收多個參數,它會將第一個參數和其余參數一次比較
  • 例子: {{eq arg1 arg2 arg3}} ==> arg1== arg2||arg1 == arg3

自定義函數

  • 在嵌套模板中存在預定義函數(官方已經定義好的)和自定義函數(自己定義的),自定義函數使得模板更加靈活.

  • 自定義函數通過調用Funcs()方法實現

    • Funcs()方法定義: func (t *Template) Funcs(funcMap FuncMap) *Template
    • FuncMapd定義:type FuncMap map[string]interface{}
  • 定義步驟:

    • 1.先到后端代碼中定義一個函數: (匿名函數為例)

      • hello := func() (string){return "Hello!"
        }
        
    • 2.調用Funcs()方法

      • 注意: 調用Funcs()方法,需要在解析模板前調用,也就是在Parse()方法前

      • bytes,err := ioutil.ReadFile("文件名/文件路徑") 
        templl,err := template.New("為模板命名(盡量和文件名字一致)").Funcs(template.FuncMap{"hello":hello}).Parse(string(bytes))
        
      1. 在模板中調用函數:
      • {{hello}}
      • 這里的hello是指定FuncMap中的key,也就是上面的"hello"

嵌套模板

  • 介紹: 嵌套模板也就是,在一個html文件中使用多個模板,被嵌套的模板可以是一個單獨的html文件,還可以利用define關鍵字在該模板下定義一個模板

    • define語法: {{define “name”}} T(內容) {{end}}
  • 通過template關鍵字來執行模板

    • 語法:
      • {{template "name"}}
      • {{template "name" pipeline}}
  • 例子:(模板代碼)Demo.html

    • <html><body><h1>{{template "title.html"}}</h1><div>{{template "content.html"}}</div></body>
      </html>
      {{/*define 的定義寫在html標簽之下*/}}
      {{define "content.html"}}<li>小明</li><li>小紅</li>
      {{end}}
      
    • title.html文件定義

      • <ul><il>你好</il>
        </ul>
        
  • 后端代碼(主要):

    • tmpl,err :=template.ParseFiles("Demo.html路徑","title.html路徑")
      
    • 在解析代碼的時候,需要將包含其他模板的文件寫在第一位,其余的可隨意順序

  • 相關類似代碼:

    • hello.html文件

      • <p>大家好,我是小黑子</p>
        
    • Sever.html文件

      • <!DOCTYPE html>
        <html lang="en">
        <head><meta charset="UTF-8"><title>嵌套模板</title>
        </head>
        <body>{{/*自定義函數加模板嵌套*/}}<h1>{{Hello}}</h1><hr><h2>{{template "hello.html"}}</h2><p>{{.}}真帥!</p><hr>{{template "come.html"}}
        </body>
        </html>
        {{define "come.html"}}
        <ul><li></li><li></li><li>rap</li><li>籃球</li>
        </ul>
        {{end}}
        
    • 后端代碼:

      • package mainimport ("html/template""log""net/http"
        )func main() {http.HandleFunc("/", hello)http.ListenAndServe(":9000", nil)
        }func hello(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板,自定義函數Hello := func() string {return "--- 歡迎來到我的舞臺 ---"}tmpl, err := template.New("Sever.html").Funcs(template.FuncMap{"Hello": Hello}).ParseFiles("src\\使用html和template包\\Go語言模板語法\\嵌套模板\\Sever.html","src\\使用html和template包\\Go語言模板語法\\嵌套模板\\hello.html")if err != nil {log.Println("解析模板失敗!")return}name := "賢哥"//渲染模板err = tmpl.Execute(w, name)if err != nil {log.Println("渲染模板失敗!:", err)}
        }
    • 這里包含了 對自定義函數,嵌套模板,以及傳值的使用


模板繼承

  • 介紹: 模板繼承是指對各種類似的固定板塊的復用,例如說很多時候我們的開發網站的時候,其實不同的網頁很多的地方都是類似的,所以說利用模板繼承可以復用模板,減少工作量,代碼也更加簡潔

  • 關鍵字block

    • 語法:{{block "name" pipeline}} T {{end}}
  • 需要繼承的模板,需要先繼承根模板,然后再利用define關鍵字定義內容

  • 例子

    • base.tmp文件

      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><title>模板繼承</title>
      </head>
      <style>*{background-color:white;}
      </style>
      <body>
      <h1  style="color:red">模板繼承</h1>
      <hr>
      <h2  style="color:blue">變化的內容:</h2>
      <div>{{block "context" .}}<p>會發生變化的地方</p><div><a href="http://localhost:9000/index">Index頁面</a><br><a href="http://localhost:9000/home">Home頁面</a></div>{{end}}</div>
      </body>
      </html>
      
      • 其中涉及一點點的css內容,不影響閱讀
    • index.tmpl文件

      {{/*繼承根模板*/}}
      {{template "base.tmpl" .}}
      {{/*定義塊模板*/}}
      {{define "context"}}
      <h2>Index頁面</h2>
      <p>Hello,{{.}}</p>
      <a href="http://localhost:9000">Base頁面</a>
      {{end}}
      
      • 先是繼承然后定義內容,其中{{template "base.tmpl" .}}的" . “指傳入的值,而<p>Hello,{{.}}</p>的” . "接收該值
      • 還有這里define后面的文件名,一定要與block時定義的名字一致
    • home.tmpl文件

      {{/*繼承根模板*/}}
      {{template "base.tmpl" .}}
      {{/*定義塊模板*/}}
      {{define "context"}}<h2>Home頁面</h2><p>Hello,{{.}}</p><a href="http://localhost:9000">Base頁面</a>
      {{end}}
      
      • 和上面的基本一致
    • 后端代碼

      package mainimport ("html/template""log""net/http"
      )func main() {http.HandleFunc("/", base)http.HandleFunc("/index", index)http.HandleFunc("/home", home)err := http.ListenAndServe(":9000", nil)if err != nil {log.Println(err)return}
      }func base(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go語言模板語法\\模板繼承\\base.tmpl")if err != nil {log.Println("解析失敗:", err)return}//渲染模板err = t.Execute(w, nil)if err != nil {log.Println("渲染失敗:", err)return}
      }func index(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板(涉及嵌套模板)t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go語言模板語法\\模板繼承\\base.tmpl","src\\使用html和template包\\Go語言模板語法\\模板繼承\\index.tmpl")if err != nil {log.Println("解析失敗:", err)return}name := "賢哥!"//渲染模板err = t.ExecuteTemplate(w, "index.tmpl", name)if err != nil {log.Println("渲染失敗:", err)return}
      }
      func home(w http.ResponseWriter, r *http.Request) {//定義模板//解析模板t, err := template.New("base.tmpl").ParseFiles("src\\使用html和template包\\Go語言模板語法\\模板繼承\\base.tmpl","src\\使用html和template包\\Go語言模板語法\\模板繼承\\home.tmpl")if err != nil {log.Println("解析失敗:", err)return}name := "振哥!"//渲染模板err = t.ExecuteTemplate(w, "home.tmpl", name)if err != nil {log.Println("渲染失敗:", err)return}
      }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36799.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sql-libs靶場-----0x00、環境準備

文章目錄 一、PhPstudy下載、安裝二、Sqli-libs下載、搭建三、啟用Sqli-libs phpstudy地址&#xff1a;https://www.xp.cn/ sqli-libs地址&#xff1a;https://github.com/Audi-1/sqli-labs 一、PhPstudy下載、安裝 1、下載–解壓–安裝&#xff0c;安裝完成如下圖 2、更換php…

【學習筆記】[AGC021F] Trinity

有點難&#x1f605; 考慮加入每一列&#xff0c;發現我們只關心當前還未確定的行的數目 有點難算&#x1f605; 設 d p i , j dp_{i,j} dpi,j?表示有 i i i列&#xff0c;其中 j j j行未確定的方案數。欽定每一列至少有一個黑色格子。 d p i , j j ( j 1 ) 2 d p i ? 1…

IGV.js 的完全本地化運行探索

問題及解決方法 IGV.js 完全本地化是為了合規&#xff0c;不使用外網的情況下查看基因組。不聯網需要下載 genomes.json 文件及其中的內容之外&#xff0c;還需要修改 igv.js本身&#xff0c;防止5s超時后才顯示網頁內容。修改的關鍵詞是: genomes.json&#xff0c;改為本地的…

Leetcode-每日一題【劍指 Offer 13. 機器人的運動范圍】

題目 地上有一個m行n列的方格&#xff0c;從坐標 [0,0] 到坐標 [m-1,n-1] 。一個機器人從坐標 [0, 0] 的格子開始移動&#xff0c;它每次可以向左、右、上、下移動一格&#xff08;不能移動到方格外&#xff09;&#xff0c;也不能進入行坐標和列坐標的數位之和大于k的格子。例…

一個簡單實用的線程池及線程池組的實現!

1.線程池簡介 線程池&#xff0c;顧名思義&#xff0c;就是一個“池子”里面放有多個線程。為什么要使用線程池呢&#xff1f;當我們編寫的代碼需要并發異步處理很多任務時候&#xff0c;一般的處理辦法是一個任務開啟一個線程去處理&#xff0c;處理結束后釋放線程。可是這樣…

【QT】窗口通過dragEnterEvent和dropEvent拖拽導入文件

【QT】窗口通過dragEnterEvent和dropEvent拖拽導入文件 界面允許接受拖拽 在界面的構造函數中設置接受拖拽放置文件 setAcceptDrops(true); 拖拽進入、放下事件 dragEnterEvent函數對拖動的文件進行過濾&#xff0c;如果不符合過濾條件按將無法拖拽進入窗口 dropEvent函數…

支付總架構解析

一、支付全局分層 一筆支付以用戶為起點&#xff0c;經過眾多支付參與者之后&#xff0c;到達央行的清算賬戶&#xff0c;完成最終的資金清算。那么我們研究支付宏觀&#xff0c;可以站在央行清算賬戶位置&#xff0c;俯視整個支付金字塔&#xff0c;如圖1所示&#xff1a; 圖…

[保研/考研機試] KY135 又一版 A+B 浙江大學復試上機題 C++實現

題目鏈接&#xff1a; KY135 又一版 AB https://www.nowcoder.com/share/jump/437195121691736185698 描述 輸入兩個不超過整型定義的非負10進制整數A和B(<231-1)&#xff0c;輸出AB的m (1 < m <10)進制數。 輸入描述&#xff1a; 輸入格式&#xff1a;測試輸入包…

小米200萬LOGO設計的前端實現技術詳解

引言 小米是一家知名的科技公司&#xff0c;擁有眾多粉絲。其標志性的LOGO是小米200萬像素的文字LOGO&#xff0c;給人留下了深刻的印象。本文將詳細介紹小米200萬LOGO的前端設計實現技術&#xff0c;包括HTML、CSS和JavaScript的使用&#xff0c;以及展示最多的代碼示例。 設…

mysql使用redis+canal實現緩存一致性

一、開啟binlog日志 1.首先查看是否開啟了binlog show variables like %log_bin%; 如果是OFF說明位開啟 2、開啟binlog日志&#xff0c;并重啟mysql服務 右鍵我的電腦——管理——服務——MYSQL——屬性 這里是my.ini地址 在[mysqld]底下添加 log-bin mysqlbinlog binlog-f…

c#設計模式-創建型模式 之 工廠模式

前言&#xff1a; 工廠模式&#xff08;Factory Pattern&#xff09;是一種常用的對象創建型設計模式。該模式的主要思想是提供一個創建對象的接口&#xff08;也可以是抽象類、靜態方法等&#xff09;&#xff0c;將實際創建對象的工作推遲到子類中進行。這樣一來&#xff0c…

【計算機視覺|生成對抗】帶條件的對抗網絡進行圖像到圖像的轉換

本系列博文為深度學習/計算機視覺論文筆記&#xff0c;轉載請注明出處 標題&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 鏈接&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks | IEEE Conference Publicati…

Spring-2-深入理解Spring 注解依賴注入(DI):簡化Java應用程序開發

今日目標 掌握純注解開發依賴注入(DI)模式 學習使用純注解進行第三方Bean注入 1 注解開發依賴注入(DI)【重點】 問題導入 思考:如何使用注解方式將Bean對象注入到類中 1.1 使用Autowired注解開啟自動裝配模式&#xff08;按類型&#xff09; Service public class StudentS…

HTTP 協議的基本格式和 fiddler 的用法

目錄 一. HTTP 協議 1. HTTP協議是什么 2. HTTP協議的基本格式 HTTP請求 首行 GET和POST方法&#xff1a; 其他方法 經典面試題&#xff1a; URL Header(請求報頭)部分 空行 ?HTTP響應 狀態碼總結: 二、Fiddler的用法 1.Fidder的安裝 2.Fidder的使用 一. HTTP 協議 1. H…

解決macOS執行fastboot找不到設備的問題

背景 最近準備給我的備用機Redmi Note 11 5G刷個類原生的三方ROM&#xff0c;MIUI實在是用膩了。搜羅了一番&#xff0c;在XDA上找到了一個基于Pixel Experience開發的ROM&#xff1a;PixelExperience Plus for Redmi Note 11T/11S 5G/11 5G/POCO M4 Pro 5G (everpal)&#xf…

TMC Self-Managed 提升跨多云環境安全性

作為云原生技術棧的關鍵技術之一&#xff0c;Kubernetes 被企業用戶廣泛試用并開始支撐實際業務應用運行&#xff0c;實現技術先進性帶來的生產力提升。但與此同時&#xff0c;隨著 Kubernetes 技術的不斷廣泛與深化使用&#xff0c;企業用戶也開始面臨諸多技術上的挑戰&#x…

嵌入式:ARM Day1

1. 思維導圖 2.作業一 3.作業2

Android T 窗口層級其二 —— 層級結構樹的構建(更新中)

如何通過dump中的內容找到對應的代碼&#xff1f; 我們dump窗口層級發現會有很多信息&#xff0c;adb shell dumpsys activity containers 這里我們以其中的DefaultTaskDisplayArea為例 在源碼的framework目錄下查找該字符串&#xff0c;找到對應的代碼就可以通過打印堆棧或者…

日常BUG —— Java判空注解

&#x1f61c;作 者&#xff1a;是江迪呀??本文關鍵詞&#xff1a;日常BUG、BUG、問題分析??每日 一言 &#xff1a;存在錯誤說明你在進步&#xff01; 一. 問題描述 問題一&#xff1a; 在使用Java自帶的注解NotNull、NotEmpty、NotBlank時報錯&#xff0c;…

CentOS8安裝Git

錯誤1. 執行yum命令報錯 【錯誤&#xff1a;Invalid configuration value: failovermethodpriority in /etc/yum.repos.d/CentOS-epel.repo; 配置&#xff1a;ID 為 "failovermethod" 的 OptionBinding 不存在】 1.cd /etc/yum.repos.d 2.vim CentOS-epel.repo //…