GO 語言進階之 Template 模板使用

更多個人筆記見:
github個人筆記倉庫
gitee 個人筆記倉庫
個人學習,學習過程中還會不斷補充~ (后續會更新在github上)

文章目錄

  • Template 模板
    • 基本示例
    • 語法
      • 1. 基本輸出語法
      • 2. 控制結構
      • 3. 空白字符控制
      • 4. Must函數

Template 模板

基本示例

package mainimport ("fmt""html/template""os"
)// 定義數據結構
type Person struct {Name    stringAge     intEmail   stringIsAdmin bool
}type Company struct {Name      stringEmployees []PersonFounded   int
}func main() {// 示例1:基本語法演示basicTemplateDemo()// 示例2:條件判斷和循環conditionalAndLoopDemo()// 示例3:HTML模板htmlTemplateDemo()// 示例4:Must的使用mustTemplateDemo()
}// 基本語法演示
func basicTemplateDemo() {fmt.Println("=== 基本語法演示 ===")// {{.}} 表示當前數據對象tmpl1 := `Hello {{.}}!`t1 := template.Must(template.New("basic").Parse(tmpl1))t1.Execute(os.Stdout, "World")fmt.Println()// {{.Name}} 訪問結構體字段person := Person{Name: "張三", Age: 30, Email: "zhangsan@example.com"}tmpl2 := `姓名: {{.Name}}, 年齡: {{.Age}}, 郵箱: {{.Email}}`t2 := template.Must(template.New("person").Parse(tmpl2)) //person 是模板名字t2.Execute(os.Stdout, person)   //對應的結構體fmt.Println("\n")
}// 條件判斷和循環演示
func conditionalAndLoopDemo() {fmt.Println("=== 條件判斷和循環演示 ===")company := Company{Name:    "科技公司",Founded: 2020,Employees: []Person{{Name: "李四", Age: 25, Email: "lisi@example.com", IsAdmin: true},{Name: "王五", Age: 28, Email: "wangwu@example.com", IsAdmin: false},{Name: "趙六", Age: 32, Email: "zhaoliu@example.com", IsAdmin: false},},}// 使用 {{range .}} 循環和 {{if}} 條件判斷// {{- 和 -}} 用于去除空白字符tmpl := `公司: {{.Name}} (成立于 {{.Founded}}年)員工列表:{{- range .Employees}}- 姓名: {{.Name}}{{- if .IsAdmin}} (管理員){{else}} (普通員工){{end}} 年齡: {{.Age}}, 郵箱: {{.Email}}{{- end}}`//通過IsAdmin 進行判斷是否是管理員t := template.Must(template.New("company").Parse(tmpl))t.Execute(os.Stdout, company) //傳入的 company 是一個大結構體,里面包括 Employees 列表fmt.Println()
}// HTML模板演示
func htmlTemplateDemo() {fmt.Println("=== HTML模板演示 ===")// HTML模板會自動轉義特殊字符htmlTmpl := `
<!DOCTYPE html>
<html>
<head><title>{{.Name}} - 員工列表</title>
</head>
<body><h1>{{.Name}}</h1><p>成立年份: {{.Founded}}</p><h2>員工信息</h2><table border="1"><tr><th>姓名</th><th>年齡</th><th>郵箱</th><th>角色</th></tr>{{- range .Employees}}<tr><td>{{.Name}}</td><td>{{.Age}}</td><td>{{.Email}}</td><td>{{- if .IsAdmin -}}<span style="color: red;">管理員</span>{{- else -}}普通員工{{- end -}}</td></tr>{{- end}}</table>
</body>
</html>
`company := Company{Name:    "示例科技公司",Founded: 2020,Employees: []Person{{Name: "張三", Age: 30, IsAdmin: true},{Name: "李四", Age: 25, IsAdmin: false},},}// 創建HTML文件file, err := os.Create("company.html")  //創建接收的文件if err != nil {panic(err)}defer file.Close()t := template.Must(template.New("html").Parse(htmlTmpl))t.Execute(file, company)  //這里不是 os.stdout輸出了,而是輸出到了文件中fmt.Println("HTML文件已生成: company.html")
}// Must的使用演示
func mustTemplateDemo() {fmt.Println("=== Must使用演示 ===")// Must會在模板解析失敗時直接panic// 這是一個正確的模板validTemplate := `Hello {{.Name}}!`t1 := template.Must(template.New("valid").Parse(validTemplate))person := Person{Name: "測試用戶"}fmt.Print("正確模板輸出: ")t1.Execute(os.Stdout, person)fmt.Println()// 演示錯誤處理(注釋掉以避免程序崩潰)/*// 這是一個錯誤的模板語法,Must會直接panicinvalidTemplate := `Hello {{.Name!` // 缺少右括號t2 := template.Must(template.New("invalid").Parse(invalidTemplate))*/// 不使用Must的錯誤處理方式invalidTemplate := `Hello {{.Name!`  //這里缺少了右邊括號    t2, err := template.New("invalid").Parse(invalidTemplate) //沒有用 Must,用 Must 會 panic 導致程序退出if err != nil {fmt.Printf("模板解析錯誤: %v\n", err)} else {t2.Execute(os.Stdout, person)}
}

語法

1. 基本輸出語法

  • {{.}}: 輸出當前數據對象
  • {{.Name}}: 輸出結構體的Name字段
  • {{.Field.SubField}}: 訪問嵌套字段

2. 控制結構

  • {{if .IsAdmin}}...{{else}}...{{end}}: 條件判斷
  • {{range .Employees}}...{{end}}: 循環遍歷
  • {{with .Field}}...{{end}}: 設置上下文

3. 空白字符控制

  • {{-: 去除左側空白字符
  • -}}: 去除右側空白字符
  • {{- if .IsAdmin -}}: 去除兩側空白字符

4. Must函數

  • template.Must(): 在模板解析失敗時直接panic
  • 適用于程序啟動時的模板初始化
  • 類似于panic的檢驗機制
  • 如果需要接受錯誤就不要用 Must

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

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

相關文章

origin繪圖之【如何將多條重疊、高度重疊的點線圖、折線圖分開】

在日常的數據可視化工作中&#xff0c;Origin 作為一款功能強大的科研繪圖軟件&#xff0c;廣泛應用于實驗數據處理、結果展示與論文圖表制作等領域。然而&#xff0c;在處理多組數據、特別是繪制多條曲線的折線圖或點線圖時&#xff0c;常常會遇到這樣一個困擾&#xff1a;多條…

Java基礎 Day19

一、泛型&#xff08;JDK5引入&#xff09; 1、基本概念 在編譯階段約束操作的數據類型&#xff0c;并進行檢查 好處&#xff1a;統一數據類型&#xff0c;將運行期的錯誤提升到了編譯期 泛型的默認類型是 Object 2、泛型類 在創建類的時候寫上泛型 在創建具體對象的時候…

Gitlab-Runner安裝

文章目錄 helm方式安裝在K8S上參考gitlab CI/CD 文件變量緩存服務器K8S部署 docker鏡像mavendocker安裝docker buildx minionodehelmkubectlsonar-scanner-cli 問題清除cachehelm執行時無權限 下載鏡像失敗下載gitlab-runner鏡像失敗 Gitlab-ci中使用java前端 helm方式安裝在K8…

在 Ubuntu linux系統中設置時區的方案

查看時區 在 Ubuntu 系統中&#xff0c;可以通過以下方法查看當前時區設置&#xff1a; 1. 使用 timedatectl 命令&#xff08;推薦&#xff09; 在終端運行以下命令&#xff1a; timedatectl輸出示例&#xff1a; Local time: Sun 2025-05-25 10:30:00 CST Universal t…

YOLOv8模型剪枝筆記(DepGraph和Network Slimming網絡瘦身)

文章目錄 一、DepGraph剪枝(1)項目準備1)剪枝基礎知識2)DepGraph剪枝論文解讀12)DepGraph剪枝論文解讀23)YOLO目標檢測系列發展史4)YOLO網絡架構(2)項目實戰(YOLOv8應用DepGraph剪枝+finetune)1)安裝軟件環境(基礎環境、Pytorch、YOLOv8)Windows1)安裝軟件環境(…

MySQL:11_事務

事務 一.CURD不加控制&#xff0c;會有什么問題&#xff1f; 二.什么是事務&#xff1f; 事務就是一組DML語句組成&#xff0c;這些語句在邏輯上存在相關性&#xff0c;這一組DML語句要么全部成功&#xff0c;要么全部失敗&#xff0c;是一個整體。MySQL提供一種機制&#xf…

【notepad++如何設置成中文界面呢?】

“Notepad”是一款非常強大的文本編輯軟件&#xff0c;將其界面設置成中文的方法如下&#xff1a; 一、工具&#xff0f;原料&#xff1a; 華為 Matebook 15、Windows 10、Notepad 8.4.6。 二 、具體步驟&#xff1a; 1、找到任意一個文本文件&#xff0c;比如 txt 格式的文…

職坐標嵌入式MCU/DSP與RTOS開發精講

嵌入式系統開發作為現代智能設備與工業控制的核心技術領域&#xff0c;其架構設計與實現邏輯直接影響系統性能與可靠性。本課程以嵌入式系統架構為切入點&#xff0c;系統化梳理從硬件選型到軟件調度的全鏈路知識體系&#xff0c;重點聚焦微控制器&#xff08;MCU&#xff09;與…

雙深度Q網絡(Double DQN)基礎解析與python實例:訓練穩定倒立擺

目錄 1. 前言 2. Double DQN的核心思想 3. Double DQN 實例&#xff1a;倒立擺 4. Double DQN的關鍵改進點 5. 雙重網絡更新策略 6. 總結 1. 前言 在強化學習領域&#xff0c;深度Q網絡&#xff08;DQN&#xff09;開啟了利用深度學習解決復雜決策問題的新篇章。然而&am…

使用KubeKey快速部署k8s v1.31.8集群

實戰環境涉及軟件版本信息&#xff1a; 使用kubekey部署k8s 1. 操作系統基礎配置 設置主機名、DNS解析、時鐘同步、防火墻關閉、ssh免密登錄等等系統基本設置 dnf install -y curl socat conntrack ebtables ipset ipvsadm 2. 安裝部署 K8s 2.1 下載 KubeKey ###地址 https…

SQL:窗口函數(Window Functions)

目錄 什么是窗口函數&#xff1f; 基本語法結構 為什么要用窗口函數&#xff1f; 常見的窗口函數分類 1?? 排名類函數 2?? 聚合類函數&#xff08;不影響原始行&#xff09; 3?? 值訪問函數 窗口范圍說明&#xff08;ROWS / RANGE&#xff09; 什么是窗口函數&a…

相機內參 opencv

視場角定相機內參 import numpy as np import cv2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Ddef calculate_camera_intrinsics(image_width640, image_height480, fov55, is_horizontalTrue):"""計算相機內參矩陣參數:image_w…

MATLAB 各個工具箱 功能說明

? 想必大家在安裝MATLAB時&#xff0c;或多或少會疑惑應該安裝哪些工具箱。筆者遇到了兩種情況——只安裝了MATLAB主程序&#xff0c;老師讓用MATLAB的時候卻發現沒有安裝對應安裝包&#xff1b;第二次安裝學聰明了&#xff0c;全選安裝&#xff0c;嗯……占用了20多個G。 ?…

學習日記-day14-5.23

完成目標&#xff1a; 學習java下半段課程 知識點&#xff1a; 1.多態轉型 知識點 核心內容 重點 多態轉型 向上轉型&#xff08;父類引用指向子類對象&#xff09; 與向下轉型&#xff08;強制類型轉換&#xff09;的機制與區別 向上轉型自動完成&#xff0c;向下轉型需…

【編程語言】【Java】一篇文章學習java,復習完善知識體系

第一章 Java基礎 1.1 變量與數據類型 1.1.1 基本數據類型 1.1.1.1 整數類型&#xff08;byte、short、int、long&#xff09; 在 Java 中&#xff0c;整數類型用于表示沒有小數部分的數字&#xff0c;不同的整數類型有不同的取值范圍和占用的存儲空間&#xff1a; byte&am…

匯量科技前端面試題及參考答案

數組去重的方法有哪些&#xff1f; 在 JavaScript 中&#xff0c;數組去重是一個常見的操作&#xff0c;有多種方法可以實現這一目標。每種方法都有其適用場景和性能特點&#xff0c;下面將詳細介紹幾種主要的去重方法。 使用 Set 數據結構 Set 是 ES6 引入的一種新數據結構&a…

Git實戰演練,模擬日常使用,快速掌握命令

01 引言 上一期借助Idea&#xff0c;完成了Git倉庫的建立、配置、代碼提交等操作&#xff0c;初步入門了Git的使用。然而日常開發中經常面臨各種各樣的問題&#xff0c;入門級的命令遠遠不夠使用。 這一期&#xff0c;我們將展開介紹Git的日常處理命令&#xff0c;解決日常問…

wordpress主題開發中常用的12個模板文件

在WordPress主題開發中&#xff0c;有多種常用的模板文件&#xff0c;它們負責控制網站不同部分的顯示內容和布局&#xff0c;以下是一些常見的模板文件&#xff1a; 1.index.php 這是WordPress主題的核心模板文件。當沒有其他更具體的模板文件匹配當前頁面時&#xff0c;Wor…

數據庫blog5_數據庫軟件架構介紹(以Mysql為例)

&#x1f33f;軟件的架構 &#x1f342;分類 軟件架構總結為兩種主要類型&#xff1a;一體式架構和分布式架構 ● 一體化架構 一體式架構是一種將所有功能集成到一個單一的、不可分割的應用程序中的架構模式。這種架構通常是一個大型的、復雜的單一應用程序&#xff0c;包含所…

離線服務器算法部署環境配置

本文將詳細記錄我如何為一臺全新的離線服務器配置必要的運行環境&#xff0c;包括基礎編譯工具、NVIDIA顯卡驅動以及NVIDIA-Docker&#xff0c;以便順利部署深度學習算法。 前提條件&#xff1a; 目標離線服務器已安裝操作系統&#xff08;本文以Ubuntu 18.04為例&#xff09…