如何在Go中使用模板

引言

您是否需要以格式良好的輸出、文本報告或HTML頁面呈現一些數據?你可以使用Go模板來做到這一點。任何Go程序都可以使用text/templatehtml/template包(兩者都包含在Go標準庫中)來整齊地顯示數據。

這兩個包都允許你編寫文本模板并將數據傳遞給它們,以按你喜歡的格式呈現文檔。在模板中,可以遍歷數據并使用條件邏輯來決定在文檔中包含哪些項以及它們應該如何顯示。本教程將向您展示如何使用這兩個模板包。首先,你將使用text/template將一些數據渲染為使用循環、條件邏輯和自定義函數的純文本報告。然后你將使用html/template將相同的數據渲染到一個沒有代碼注入的html文檔中。

前期準備

步驟1 -導入text/template

假設你想要生成一份關于狗的數據的簡單報告。你希望像這樣顯示它:

---
Name:  JujubeSex:   Female (spayed)Age:   10 monthsBreed: German Shepherd/Pitbull---
Name:  ZephyrSex:   Male (intact)Age:   13 years, 3 monthsBreed: German Shepherd/Border Collie

這是你將使用text/template包生成的報告。突出顯示的項目是您的數據,其余是來自模板的靜態文本。模板要么以字符串的形式存在于代碼中,要么與代碼放在一起的文件中。它們包含與條件語句(即if/else)、流控制語句(即循環)和函數調用交織在一起的樣板靜態文本,所有這些都包裝在{{. . .}}標記中。您將向模板傳遞一些數據以渲染像上面那樣的最終文檔。

首先,導航到你的Go工作空間(go env GOPATH)并為這個項目創建一個新目錄:

cd `go env GOPATH`
mkdir pets
cd pets

使用nano或者你最喜歡的文本編輯器,打開一個名為pets.go的新文件并粘貼以下內容:

nano pets.go

pets.go

package mainimport ("os""text/template"
)func main() {
}

這個文件聲明自己在main包中,并包含一個main函數,這意味著它可以使用go run運行。它導入了text/template標準庫包,以允許你編寫和渲染模板,以及os,用于打印到終端。

步驟2 -創建模板數據

在編寫模板之前,讓我們創建一些數據來傳遞給模板。在import語句下面,main()語句之前,定義一個名為Pet的結構體,其中包含寵物的NameSex、寵物是否閹割(complete)、AgeBreed字段。編輯pets.go并添加以下結構體:

pets.go

. . .
type Pet struct {Name   stringSex    stringIntact boolAge    stringBreed  string
}
. . .

現在,在main()函數的主體中,創建一個Pet的切片來保存關于兩只狗的數據:

pets.go

. . .
func main() {dogs := []Pet{{Name:   "Jujube",Sex:    "Female",Intact: false,Age:    "10 months",Breed:  "German Shepherd/Pitbull",},{Name:   "Zephyr",Sex:    "Male",Intact: true,Age:    "13 years, 3 months",Breed:  "German Shepherd/Border Collie",},}
} // end main

這些數據將被傳遞到您的模板以渲染最終報告。當然,傳遞給模板的數據可以來自任何地方:數據庫、第三方API等。對于本教程,最簡單的方法是將一些示例數據粘貼到代碼中。

現在讓我們看看如何渲染(用這些包的術語來說就是執行)一個模板。

步驟3 -執行模板

在這一步中,你將看到如何使用text/template從模板生成一個完成的文檔,但直到第4步,你才會真正編寫一個有用的模板。

創建一個名為pets.tmpl的空文本文件,其中包含一些靜態文本:

pets.tmpl

Nothing here yet.

保存模板并退出編輯器。如果你使用的是nano,按下CTRL+X,然后YENTER來確認你的更改。

雖然執行這個模板只會打印“Nothing here yet”。,讓我們傳入數據并執行模板,只是為了證明text/template是有效的。在你的main()函數中,在dogs切片的后面添加以下代碼:

pets.go

	. . .var tmplFile = “pets.tmpl”tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)if err != nil {panic(err)}err = tmpl.Execute(os.Stdout, dogs)if err != nil {panic(err)}
} // end main

在這段代碼中,你使用Template.New來創建一個新的Template,然后在生成的模板上調用ParseFiles來解析你的最小模板文件。檢查錯誤后,調用新模板的Execute方法,傳入os.Stdout將完成的報告打印到終端,同時傳入dogs切片。對于第一個參數,您可以傳入任何實現’ io.Writer '接口的東西,例如,您可以將報告寫入文件。稍后我們將看到如何做到這一點。

完整的程序看起來應該像這樣:

package mainimport ("os""text/template"
)type Pet struct {Name   stringSex    stringIntact boolAge    stringBreed  string
}func main() {dogs := []Pet{{Name:   "Jujube",Sex:    "Female",Intact: false,Age:    "10 months",Breed:  "German Shepherd/Pitbull",},{Name:   "Zephyr",Sex:    "Male",Intact: true,Age:    "13 years, 3 months",Breed:  "German Shepherd/Border Collie",},}var tmplFile = “pets.tmpl”tmpl, err := template.New(tmplFile).ParseFiles(tmplFile)if err != nil {panic(err)}err = tmpl.Execute(os.Stdout, dogs)<

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

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

相關文章

“C語言“——scanf()、getchar() 、putchar()、之間的關系

scanf函數說明 scanf函數是對來自于標準輸入流的輸入數據作格式轉換&#xff0c;并將轉換結果保存至format后面的實參所指向的對象。 而const char*format 指向的字符串為格式控制字符串&#xff0c;它指定了可輸入的字符串以及賦值時轉換方法。 簡單來說給一個打印格式(輸入…

【并發編程篇】源碼分析,手動創建線程池

文章目錄 &#x1f6f8;前言&#x1f339;Executors的三大方法 &#x1f354;簡述線程池&#x1f386;手動創建線程池?源碼分析?代碼實現&#xff0c;手動創建線程池&#x1f388;CallerRunsPolicy()&#x1f388;AbortPolicy()&#x1f388;DiscardPolicy()&#x1f388;Dis…

LNPMariadb數據庫分離|web服務器集群

LNP&Mariadb數據庫分離&#xff5c;web服務器集群 網站架構演變單機版LNMP獨立數據庫服務器web服務器集群與Session保持 LNP與數據庫分離1. 準備一臺獨立的服務器&#xff0c;安裝數據庫軟件包2. 將之前的LNMP網站中的數據庫遷移到新的數據庫服務器3. 修改wordpress網站配置…

2023.12.24 關于 Redis 中 String 類型內部編碼 及 應用場景

目錄 String 類型內部編碼 3 種內部編碼方式 String 類型應用場景 Cache 緩存 鍵名命名規則 計數&#xff08;Counter&#xff09; 共享會話&#xff08;Session &#xff09; 手機驗證碼 總結 String 類型內部編碼 3 種內部編碼方式 int&#xff1a;用來表示 64 位 —…

vue3菜單權限管理實現

前提 你的菜單是根據路由動態生成的&#xff0c;具體可以參考這篇博客對el-menu組件進行遞歸封裝&#xff08;根據路由配置動態生成&#xff09; 描述 首先將路由分為常量路由constantRoute&#xff08;所有用戶都有的路由&#xff09;和異步路由asyncRoute&#xff08;需要動…

Gradle 插件

自定義Gradle插件 - 簡書

小天使的小難題:新生兒疝氣的關注與溫馨呵護

引言&#xff1a; 新生兒疝氣是一種在出生后可能出現的常見情況&#xff0c;雖然通常不會造成長期影響&#xff0c;但對于家長而言&#xff0c;了解如何正確應對新生兒疝氣是至關重要的。本文將深入探討新生兒疝氣的原因、癥狀&#xff0c;以及家長在面對這一問題時應該采取的…

1224. 交換瓶子(藍橋杯/圖論)

題目&#xff1a; 1224. 交換瓶子 - AcWing題庫 輸入樣例1&#xff1a; 5 3 1 2 5 4輸出樣例1&#xff1a; 3輸入樣例2&#xff1a; 5 5 4 3 2 1輸出樣例2&#xff1a; 2 思路&#xff1a;圖論 1.將對應的位置與當前的瓶子序列相連形成環。 2.最少交換次數能形成的最多…

Vue中的事件委托(事件代理)使用方法介紹

事件委托&#xff08;事件代理&#xff09; 將原本需要綁定在子元素上的事件監聽器委托在父元素上&#xff0c;讓父元素充當事件監聽的職務。 事件委托是一種利用事件冒泡的特性&#xff0c;在父節點上響應事件&#xff0c;而不是在子節點上響應事件的技術。它能夠改善性能&a…

如何理解JDK、JRE、JVM區別與聯系

摘要&#xff1a;JDK是 Java 語言的軟件開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄&#xff0c;里面有兩個文件夾bin和lib&#xff0c;在這里可以認為bin里的就是jvm&#xff0c;lib中則是jvm工作所需要的類庫&#xff0c;而jvm和 lib合起來就稱為jre。 一、JDK JDK(Ja…

【【迭代16次的CORDIC算法-verilog實現】】

迭代16次的CORDIC算法-verilog實現 -32位迭代16次verilog代碼實現 CORDIC.v module cordic32#(parameter DATA_WIDTH 8d32 , // we set data widthparameter PIPELINE 5d16 // Optimize waveform)(input …

第十四章Java博客

lambda就是數學中的“λ”的讀音&#xff0c;lambda表達式是基于λ演算而得名的&#xff0c;因為lambda抽象&#xff08;lambda abstraction&#xff09;表示一個匿名的函數&#xff0c;于是開發語言也將lambda表達式用來表示匿名函數&#xff0c;也就是沒有函數名字的函數。C#…

maven管理工具使用package打包的時候無法將lib文件夾下的第三方jar包打入,上線打jar包后運行異常問題

問題描述&#xff1a; 調用第三方接口的時候通過手動引入了第三方的兩個jar包到我本項目的lib文件夾下&#xff0c;并在pom文件添加入下配置&#xff1a; <dependency><groupId>cn.xxxx.xxxx.core</groupId><artifactId>xxxx-core</artifactId>…

Spring Boot 中實現跨域的幾種方式

前言 在現代Web應用中&#xff0c;由于安全性和隱私的考慮&#xff0c;瀏覽器限制了從一個域向另一個域發起的跨域HTTP請求。解決這個問題的一種常見方式是實現跨域資源共享&#xff08;CORS&#xff09;。Spring Boot提供了多種方式來處理跨域請求&#xff0c;本文將介紹其中的…

C語言字符串處理提取時間(ffmpeg返回的時間字符串)

【1】需求 需求&#xff1a;有一個 “00:01:33.90” 這樣格式的時間字符串&#xff0c;需要將這個字符串的時間值提取打印出來&#xff08;提取時、分、秒、毫秒&#xff09;。 這個時間字符串從哪里來的&#xff1f; 是ffmpeg返回的時間&#xff0c;也就是視頻的總時間。 下…

vs快捷鍵

ctrlMo 折疊代碼塊 ctrlML 打開代碼塊

電子電器架構(E/E)演化 —— 主流主機廠域集中架構概述

電子電器架構(E/E)演化 —— 主流主機廠域集中架構概述 我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 屏蔽力是信息過載時代一個人的特殊競爭力,任何消耗你的人和事,多看一眼都是你的不對。…

系列七(實戰)、發送 接收單向消息(Java操作RocketMQ)

一、發送 & 接收單向消息 1.1、概述 發送單向消息&#xff0c;適用于發送方不關心或者不在意消息的發送結果&#xff0c;這種方式的吞吐量很大&#xff0c;但是存在消息丟失的風險&#xff0c;對于重要消息要慎用&#xff01;該種方式通常適用于對消息沒有那么嚴格的場景中…

類和對象的創建和實例化

1. 類的概述 1.1 具體示例 類是描述一類事物的特征和行為的統稱&#xff0c;抽象的不存在的&#xff0c;泛指的概念&#xff0c;例如&#xff1a;描述一個人&#xff0c;從外觀上&#xff08;特征&#xff09;和言行舉止&#xff08;行為&#xff09;上進行描述外觀上&#xff…

c 語言學習:輸出階乘的算式

c 語言學習&#xff1a;輸出階乘的算式 代碼 #include "stdio.h"int fact(int num){if (num < 1){printf("1 ");return 1;} else {printf("%d x ",num);return num * fact(num-1);} }int main(){int num 10; // printf("plz inpu…