gin フレームワークでテンプレート関数をカスタマイズする方法。
gin フレームワークでは、テンプレートのレンダリングに Go 言語に付属するhtml/templateモジュールを使用できます。
html/templateモジュールは、eq、ne、および、or などの一連の組み込み関数を提供しますが、場合によっては、文字列の MD5 値の計算など、ニーズに合わせて一部の関数をカスタマイズする必要があります。
SetFuncMap メソッドを使用してカスタム関数をテンプレート エンジンに登録し、テンプレートで使用できるようにします。このメソッドは、FuncMap タイプのパラメーターを受け取ります。これは、キーがカスタム関数の名前であり、値がカスタム関数自体であるマッピング テーブルです。このようにして、テンプレート内の関数名を通じてカスタム関数を呼び出し、いくつかの特別な関数を実現できます。
カスタム テンプレート関数の使用シナリオは非常に幅広いです。たとえば、時間をフォーマットする関数を定義したり、タイムスタンプを人間が判読できる形式に変換したり、文字の追加に役立つ文字列の長さを計算する関数を定義したりできます。テンプレート内の文字列操作など。
gin フレームワークでテンプレート関数をカスタマイズする方法を見てみましょう。研究で使用したケースとオンラインで見たケースの 2 つのケースを共有しましょう。
ケース 1: 時刻をフォーマットする関数を定義する
main.go メイン エントリ ファイルで定義されているカスタム テンプレート関数が必要です。
package main
import (
"github.com/gin-gonic/gin"
"html/template"
"net/http"
"time"
)
// 定一个函数,这里就是我们自定义的函数了
func UnitTime(timestamp int) string {
t := time.Unix(int64(timestamp), 0)
return t.Format("2006-01-02 15:09:01")
}
func main() {
// 定义一个路由引擎
r := gin.Default()
//自定义函数 渲染 注入模版 使用 router.SetFuncMap(template.FuncMap{}) 这个里面用到的包"html/template",就是一个第三方自定义函数包名称,负责渲染模版函数template到html内;
r.SetFuncMap(template.FuncMap{
"UnitTime": UnitTime,
})
// 加载 渲染模版
r.LoadHTMLGlob("*templates/**/*")
// 创建 路由
r.GET("/", func(ctx *gin.Context) {
new := &Article{
Title: "admin/index",
Content: "这是一个首页后台管理",
}
ctx.HTML(http.StatusOK, "default/index.html", gin.H{
"title": "首页",
"msg": "lll",
"news": new,
"score": 100,
"list": []string{"吃饭", "睡觉", "写代码"}, // 数组
"scoreList": []interface{}{
&Article{
Title: "新闻一",
Content: "新闻内容11111",
},
&Article{
Title: "新闻二",
Content: "新闻内容2222",
},
},
"data": 1686593382, //时间戳
})
})
//启动服务
r.Run(":8001")
}
同時に、これをテンプレート templates/default/index.html で使用する必要があります。HTML の使用コードは次のとおりです。
{
{ define "default/index.html" }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>default/index.html</title>
<link rel="stylesheet" href="/static/css/index.css">
</head>
<body>
<h2>实际开发常用函数,自定义函数 </h2>
<p>
{
{UnitTime .data }}
</p>
<p style="font-size:14px;color: red;">{
{.data | UnitTime}}</p>
</body>
</html>
{
{end}}
注⚠️ここでの「html/template」パッケージ、「html/template」は、Go 言語の標準ライブラリのパッケージで、HTML ページを生成するために使用されます。これは、一般的な XSS (クロスサイト スクリプティング) の脆弱性を回避して、動的データをレンダリングする安全な方法を提供します。テンプレートでは、変数、制御構造、関数などを使用して、ページの構造とコンテンツを整理できます。
注: 「html/template」は Go 言語標準ライブラリのパッケージで、HTML ページを生成するために使用されます。これは、一般的な XSS (クロスサイト スクリプティング) の脆弱性を回避して、動的データをレンダリングする安全な方法を提供します。テンプレートでは、変数、制御構造、関数などを使用して、ページの構造とコンテンツを整理できます。同時に、「html/template」は、テンプレートの継承、部分テンプレート、パイプラインなどの高度な機能もサポートしており、複雑な HTML ページをより簡単に構築できます。
ケース 2: 暗号化関数を定義する
まず、プロジェクト内に
funcMap.goという名前のファイルを作成し、カスタム テンプレート関数を保存します。コードは次のとおりです。
package main
import (
"crypto/md5"
"encoding/hex"
"html/template"
)
// 定义一个计算字符串MD5值的函数
func md5V(str string) string {
h := md5.New()
h.Write([]byte(str))
return hex.EncodeToString(h.Sum(nil))
}
// 初始化自定义函数
func InitFuncMap() template.FuncMap {
funcMap := template.FuncMap{
"md5": md5V,
}
return funcMap
}
上記のコードでは、文字列の MD5 値を計算するためにmd5Vという名前の関数を定義します。次に、
InitFuncMap関数を使用してカスタム関数 md5を初期化し、それを template.FuncMap に置きます。
次に、テンプレート ファイルでカスタム関数を使用します。コードは次のとおりです。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{
{.Title}}</title>
</head>
<body>
<p>{
{.Content}}</p>
<p>计算md5值:{
{md5 .Content}}</p>
</body>
</html>
テンプレートでカスタム関数を使用したい場合は、これらの関数を「html/template」パッケージの FuncMap に登録する必要があります。通常、カスタム関数とテンプレートを別のファイルに保存し、プログラムの初期化中にそれらをロードします。
もちろん、方法は一つではなく、上記の両方の方法を使用することができ、個人の好みに応じて選択できます。
同時に、2 番目のシナリオに補足を加え、このシナリオで使用される別の具体的な実装について説明したいと思います。
プロジェクトに「funcs.go」という名前のファイルがあり、「double」という名前のカスタム関数を定義しているとします。
package main
import (
"html/template"
)
// 自定义函数,将传入的整数翻倍
func double(x int) int {
return x * 2
}
// 初始化模板,注册自定义函数
var tmpl = template.Must(template.New("").Funcs(template.FuncMap{
"double": double,
}).ParseFiles("template.html"))
// 渲染模板
func renderTemplate(data interface{}) error {
err := tmpl.ExecuteTemplate(os.Stdout, "template.html", data)
if err != nil {
return err
}
return nil
}
上記のコードでは、「 html/template」パッケージのFuncMapに「 double」関数を登録し、 「 template.Must 」関数を使用してテンプレートを初期化します。テンプレート ファイル「template.html 」では、次のように「 double 」関数を使用できます。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Template</title>
</head>
<body>
<p>{
{ double . }}</p>
</body>
</html>
上記のテンプレートでは、ドット「. 」を使用して現在のデータ オブジェクトを表し、 「 double .」を通じてカスタム関数を呼び出します。「 renderTemplate 」関数を呼び出すと、データ オブジェクトがレンダリングのためにテンプレートに渡され、結果が出力されます。
これがあなたのお役に立てば幸いです。そしてブロガーに「いいね!」を押してください。!!