Gin框架: HTML模板渲染之配置与语法详解

Golang: Gin 渲染模板的方式 Golang: Gin 渲染模板的方式 方式1:Go 标准库 "html/template", template.ParseFiles() 方式2:"github.com/gin-gonic/gin",gin.HTML() 阅读详情
AI摘要

本文详细介绍了如何在Gin框架中配置HTML模板,包括单目录、多层级目录以及复杂目录的设置,并展示了如何使用`LoadHTMLGlob`和`LoadHTMLFiles`,以及自定义模板函数和静态文件服务器的配置方法。

Gin的HTML模板配置


1 )单一目录的配置

  • 配置模板目录,在与main.go同级下, 新建目录,下面二选一,仅作举例, 这里选择 tpls

    • templates
    • tpls
  • 在 tpls 目录下新建 news.html

    <!-- 最简单的 -->
    <h1>News Page</h1>
    
    <h3>标题:{{.title}}</h3>
    <p>内容:{{.content}}</p>
    
    • 注意,这里加上define和end头尾也可以
      {{ define "news.html" }}
      <h1>News Page</h1>
      	
      <h3>标题:{{.title}}</h3>
      <p>内容:{{.content}}</p>
      {{ end }}
      
  • 应用程序示例中配置

    • r.LoadHTMLGlob("tpls/*") 通配设定
    • r.LoadHTMLFiles("tpls/news.html") 逐个指定,多个在字符串中用,分隔

程序示例

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置模板的文件
	r.LoadHTMLGlob("tpls/*")
	// r.LoadHTMLFiles("tpls/news.html") // 逐个指定多个需要使用逗号分隔

	// 根路由
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Welcome to %v", "Home Page")
	})

	r.GET("/news", func(c *gin.Context) {
		c.HTML(statusOK, "news.html", gin.H{
			"title": "新闻标题",
			"content": "这是详细的新闻内容",
		})
	})
	r.Run()
}

2 )多目录配置

  • 配置模板目录,在与main.go同级下, 新建目录 tpls, 在内部再创建两个目录: web, admin

    • tpls/web
    • tpls/admin
  • 新建 tpls/admin/news.html

    {{ define "admin/news.html" }}
    
    <h1>News Page</h1>
    
    <h3>标题:{{.title}}</h3>
    <p>内容:{{.content}}</p>
    
    {{ end }}
    
    • 这里内容和之前保持一致, 但要注意上下的定义
    • 如果不添加,会出现 Error #01: html/template: "admin/news.html" is undefined 的错误
    • 这里的 define 和 end 非常重要
    • define 配置的路径是匹配c.HTML 中的第二个参数
  • 应用程序示例中配置

    • r.LoadHTMLGlob("tpls/**/*") 通配设定
    • r.LoadHTMLFiles("tpls/admin/news.html") 逐个指定,多个在字符串中用,分隔

程序示例

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置模板的文件
	r.LoadHTMLGlob("tpls/**/*")
	// r.LoadHTMLFiles("tpls/admin/news.html") // 逐个指定多个需要使用逗号分隔

	// 根路由
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Welcome to %v", "Home Page")
	})

	r.GET("/admin/news", func(c *gin.Context) {
		c.HTML(statusOK, "admin/news.html", gin.H{
			"title": "新闻标题",
			"content": "这是详细的新闻内容",
		})
	})

	r.Run()
}

3 )多层复杂目录配置

  • 首先看下设定的结构

    yourGinProject/ ·······························  根目录
      ├── go.mod ··································  go mod 文件
      ├── go.sum ··································  go sum 文件
      ├── main.go ·································  main 文件
      └── tpls ····································· html模板目录
      		├── a
    	    │   └── b
    	    │  		└── c
    	    │  		    └── d
    	    │  		        └── e
    	    │  		            └── news.html
    	    ├── admin
    	    │   └── news.html
    	    │
    	    └── news.html
    
    • tpls/news.html

      {{ define "news.html" }}
      
      <h1>News Page</h1>
      
      <h3>标题:{{.title}}</h3>
      <p>内容:{{.content}}</p>
      
      {{ end }}
      
    • tpls/admin/news.html

      {{ define "admin/news.html" }}
      
      <h1>News Page</h1>
      
      <h3>标题:{{.title}}</h3>
      <p>内容:{{.content}}</p>
      
      {{ end }}
      
    • tpls/a/b/c/d/e/news.html

      {{ define "a/b/c/d/e/news.html" }}
      
      <h1>News Page</h1>
      
      <h3>标题:{{.title}}</h3>
      <p>内容:{{.content}}</p>
      
      {{ end }}
      
    • 注意各个 news.html 的define设定

程序示例

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置模板的文件
	r.LoadHTMLGlob("tpls/**/**/**/**/**/*")

	// 根路由
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Welcome to %v", "Home Page")
	})

	// 这个配置和紧挨着下面的配置一致,只是路由自己设定了一个简洁版的
	r.GET("/x/news", func(c *gin.Context) {
		c.HTML(statusOK, "a/b/c/d/e/news.html", gin.H{
			"title": "新闻标题",
			"content": "这是详细的新闻内容",
		})
	})
	
	// 多层路由,同上
	r.GET("/a/b/c/d/e/news", func(c *gin.Context) {
		c.HTML(statusOK, "a/b/c/d/e/news.html", gin.H{
			"title": "新闻标题",
			"content": "这是详细的新闻内容",
		})
	})
	
	// 二级
	r.GET("/admin/news", func(c *gin.Context) {
		// r.LoadHTMLGlob("tpls/**/*") // 这里会 panic 报错
		r.LoadHTMLFiles("tpls/admin/news.html") // 这里正常可以访问,权重会大于顶部的全局配置
		c.HTML(statusOK, "admin/news.html", gin.H{
			"title": "新闻标题",
			"content": "这是详细的新闻内容",
		})
	})
	
	// 一级
	r.GET("/news", func(c *gin.Context) {
		// r.LoadHTMLGlob("tpls/*") // 这里会 panic 报错
		r.LoadHTMLFiles("tpls/news.html") // 这里正常可以访问,权重会大于顶部的全局配置
		c.HTML(statusOK, "news.html", gin.H{
			"title": "新闻标题",
			"content": "这是详细的新闻内容",
		})
	})

	r.Run()
}
  • 可以看到,在单个路由中r.LoadHTMLFiles 配置的用处了
  • 所以,以上就比较麻烦,一般而言,在一开始设计模板的时候,就要约定好规则
  • 特殊的设定只能应用于特殊的场景下

Gin的HTML模板语法


1 )基本渲染

主程序

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

type User struct {
	Id      int
	Name    string
	Hobby   string
}

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置模板的文件
	r.LoadHTMLGlob("tpls/*")

	// 根路由
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Welcome to %v", "Home Page")
	})

	r.GET("/user", func(c *gin.Context) {
		c.HTML(statusOK, "user.html", &User{
			Id:      1,
			Name:    " Wang ", // 注意,这里有2个空格
			Hobby:   "swimming",
		})
	})

	r.Run()
}

html模板

{{ define "user.html" }}

<h1>User Page</h1>

<h3>用户Id:{{.Id}}</h3>
<!-- 下面这种也是注释 -->
{{/* 这里是姓名,本身数据存在空格,但是这个去空格的方式无法去除 */}}
<h3>用户姓名:{{- .Name -}}</h3>
<h3>用户爱好:{{.Hobby}}</h3>

{{ $xId := .Id }}

<h3>演示变量:  {{- $xId -}} </h3>

{{ end }}
  • {{ .x }} x是属性,基于这种方式来输出数据
  • {{/* 这里是注释 */}} 注意 /* 和 */ 紧贴着 {{ 和 }},可以多行,不可嵌套
  • {{ $xId := .Id }} 单独设定变量, 变量名只能使用一个 $
  • {{- $xId -}} 这种去除空格,只能去除周围的空格,无法去除属性内包含的空格,且-紧贴{{和}},同时与模板值之间需要使用空格分隔

效果图

2 ) 比较, 判断, range, with

主程序

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

type Article struct {
	Title   string
	Content string
}

var statusOK = http.StatusOK

func main() {
	r := gin.Default()
	//加载模板 放在配置路由上面
	r.LoadHTMLGlob("tpls/**/*")

	//前台
	r.GET("/", func(c *gin.Context) {
		c.HTML(statusOK, "web/index.html", gin.H{
			"title": "首页",
			"msg":   " 我是msg",
			"score": 89,
			"hobby": []string{"吃饭", "睡觉", "写代码"},
			"newsList": []interface{}{
				&Article{
					Title:   "新闻标题1",
					Content: "新闻详情1",
				},
				&Article{
					Title:   "新闻标题2",
					Content: "新闻详情2",
				},
			},
			"testSlice": []string{},
			"news": &Article{
				Title:   "新闻标题",
				Content: "新闻内容",
			},
		})
	})
	r.Run()
}

html模板

{{ define "web/index.html" }}

<h2>title变量展示: {{.title}}</h2>

<!-- 定义变量 -->
{{$t := .title}}

<!-- 这里展示 title -->
<h4>
    这里通过变量,再次展现title: {{$t}}
</h4>

<!-- 条件判断 -->
<h4>这里基于判断,展示是否及格</h4>
{{if ge .score 60}}
    <p>及格</p>
{{else}}
    <p>不及格</p>
{{end}}

<h4>这里基于判断,更加细度展示成绩</h4>

{{if gt .score 90}}
    <p>优秀</p>
{{else if gt .score 80}}
    <p>良好</p>
{{else if gt .score 60}}
    <p>及格</p>
{{else}}
    <p>不及格</p>
{{end}}

<!-- 循环遍历数据 -->
<h3>下面用range开始遍历 hobby 数组</h3>
<ul>
    {{range $key,$value:=.hobby}}
    <li>{{$key}}----{{$value}}</li>
    {{end}}
</ul>

<h3>下面用range开始遍历 新闻 数组</h3>
<ul>
    {{range $key,$value:=.newsList}}
        <li>{{$key}}----{{$value.Title}}---{{$value.Content}}</li>
    {{end}}        
</ul>

<h3>下面用range遍历中,空数组场景的展示</h3>
<ul>
    {{range $key,$value:=.testSlice}}
          <li>{{$key}}----{{$value}}</li>
    {{else}}
        <li>数组中没有数据</li>
    {{end}}        
</ul>

<!-- with 解构结构体 -->
<h3>不使用 with 结构属性</h3>
<p>{{.news.Title}}</p>
<p>{{.news.Content}}</p>

<h3>使用 with 结构属性</h3>
{{with .news}}
    <p>{{.Title}}</p>
    <p>{{.Content}}</p>
{{end}}

{{ end }}
  • 关于比较函数中的一些注意事项
    • eq 如果 arg1 == arg2 则返回真
    • ne 如果 arg1 != arg2 则返回真
    • lt 如果 arg1 < arg2 则返回真
    • le 如果 arg1 <= arg2 则返回真
    • gt 如果 arg1 > arg2 则返回真
    • ge 如果 arg1 >= arg2 则返回真

效果图

3 )高阶用法:预定义函数,自定义模板函数,嵌套模板

  • 首先看下设定的结构
    yourGinProject/ ·······························  根目录
      ├── go.mod ··································  go mod 文件
      ├── go.sum ··································  go sum 文件
      ├── main.go ·································  main 文件
      └── tpls ····································· html模板目录
    	    ├── web
    	    │     └── index.html
    	    └── common
    	          └── page_header.html
    	          └── page_footer.html
    

主程序

package main

import (
	"html/template"
	"net/http"
	"time"
	"github.com/gin-gonic/gin"
)

type Article struct {
	Title   string
	Content string
}

var statusOK = http.StatusOK

//时间戳转换成日期
func UnixToTime(timestamp int) string {
	t := time.Unix(int64(timestamp), 0)
	return t.Format("2006-01-02 15:04:05") // 这个是按照这个时间来进行格式化, 必须是这个时间点, 据说是go诞生之日
}

func Println(str1 string, str2 string) string {
	return str1 + "----" + str2
}

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()

	//自定义模板函数, 注意要把这个函数放在加载模板前
	r.SetFuncMap(template.FuncMap{
		"UnixToTime": UnixToTime,
		"Println":    Println,
	})

	//加载模板 放在配置路由上面
	r.LoadHTMLGlob("tpls/**/*")

	// 前台
	r.GET("/", func(c *gin.Context) {
		c.HTML(statusOK, "web/index.html", gin.H{
			"title": "首页",
			"titleEn": "homePage",
			"msg": "demo",
			"date": 1708344953,
		})
	})

	r.Run()
}

web/index.html模板

{{ define "web/index.html" }}

  <!-- 这里定义通用头部 -->
  {{template "common/page_header.html" .}}

  <h3>下面演示: 预定义函数</h3>
  <!-- 预定义函数 -->

  {{ len .title }}
  <br />
  {{ len .titleEn }}

  <!-- 自定义模板函数 -->
  <h3>下面演示: 自定义模板函数</h3>
  {{.date}}
  <br />
  <br />
  {{UnixToTime .date}}
  <br>
  <br>
  {{Println .title .msg}}

  <!-- 这里定义通用尾部 -->
  {{template "common/page_footer.html" .}}

{{ end }}

common/page_header.html模板

{{ define "common/page_header.html" }}
    <h3>
        我是一个公共的标题---{{.title}}
    </h3>
{{end}}

common/page_footer.html模板

{{ define "common/page_footer.html" }}
    <h3>
        我是一个公共的底部
    </h3>
{{end}}
  • 在 预定义函数 中,执行模板时,函数从两个函数字典中查找

    • 首先是模板函数字典,然后是全局函数字典。
    • 一般不在模板内定义函数,而是使用 Funcs 方法添加函数到模板里
  • 预定义的全局函数如下

    • and
      • 函数返回它的第一个 empty 参数或者最后一个参数
      • 就是说"and x y"等价于"if x then y else x";所有参数都会执行
    • or
      • 返回第一个非 empty 参数或者最后一个参数
      • 亦即"or x y"等价于"if x then x else y";所有参数都会执行
    • not
      • 返回它的单个参数的布尔值的否定
    • len
      • 返回它的参数的整数类型长度
    • index
      • 执行结果为第一个参数以剩下的参数为索引/键指向的值
      • 如"index x 1 2 3"返回 x[1][2][3]的值;每个被索引的主体必须是数组、切片或者字典
    • print
      • 即 fmt.Sprint
    • printf
      • 即 fmt.Sprintf
    • println
      • 即 fmt.Sprintln
    • html
      • 返回与其参数的文本表示形式等效的转义 HTML
      • 这个函数在 html/template 中不可用
    • urlquery
      • 以适合嵌入到网址查询中的形式返回其参数的文本表示的转义值
      • 这个函数在 html/template 中不可用
    • js
      • 返回与其参数的文本表示形式等效的转义 JavaScript
    • call
      • 执行结果是调用第一个参数的返回值,该参数必须是函数类型,其余参数作为调用该函
        数的参数
      • 如"call .X.Y 1 2"等价于 go 语言里的 dot.X.Y(1, 2)
      • 其中 Y 是函数类型的字段或者字典的值,或者其他类似情况
      • call 的第一个参数的执行结果必须是函数类型的值(和预定义函数如 print 明显不同)
      • 该函数类型值必须有 1 到 2 个返回值,如果有 2 个则后一个必须是 error 接口类型
      • 如果有 2 个返回值的方法返回的 error 非 nil,模板执行会中断并返回给调用模板执行者该错误
  • 在自定义模板函数中,比如定义了 formatDate 方法,有两种用法

    • {{.now | formatDate}} 或
    • {{formatDate .now }}
  • 在嵌套 template中,注意最后的点(.)

效果图

静态文件服务器的配置


这块比较简单

主程序

package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

var statusOK = http.StatusOK

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()

	//配置静态web目录 第一个参数表示路由, 第二个参数表示映射的目录
	r.Static("/static", "./static")

	// 前台
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Welcome to %v", "Home Page")
	})

	r.Run()
}
  • 这样就设定好了,在与 main.go 同级新建 static/images 目录,添加 mysql-logo.svg 图片
  • 访问该图片: http://localhost:8080/static/images/mysql-logo.svg
  • 其他的,如:css, js 这类也同样适用
  • 这时候,静态文件服务器就搭建好了
(Golang) Gin 模板语法 在编写 Gin 应用程序时,有三种方式使用模板引擎:函数、render.HTML 中间件和 gin.Context.HTML方法。以上是关于 Gin 模板引擎的简单介绍和使用方法,掌握了这些基本特性和用法之后,可以在 Gin 应用程序的开发中使用模板引擎实现更高效的 Web 开发。学习目标:了解 Gin 模板引擎的基本特性和常用语法,掌握在 Gin 框架中使用模板引擎的方法。Gin 模板支持嵌入式模板,可以将一个模板嵌入另一个模板中,从而实现代码的重用。和 Go 模板一样,使用 `{{` 和 `}}`。 阅读详情

相关推荐

Day10 : Gin框架HTML模板与静态资源配置

本文全面介绍Gin框架的HTML模板渲染与静态文件服务功能。主要内容包括:Gin默认使用html/template包提供安全的模板渲染;详细讲解模板语法(变量、条件、循环)和布局复用(define/block);如何注册自定义函数增强模板能力;通过Static/StaticFS提供静态资源服务。文章最后通过一个完整的博客项目示例,展示了模板继承、数据渲染和静态资源配置的实际应用,并提供了开发热重载和性能优化建议。Gin不仅适合构建API,也能高效开发传统Web应用。

分享AI、区块链技术及应用,未来已来 63

【Gin】HTML 的模板渲染与静态资源文件的加载

HTML 的模板渲染与静态资源文件的加载

徒挽的博客 2627

Gin HTML 模板渲染

Gin HTML模板入门

qq_30895747的博客 646

gin框架03--html 模板渲染

介绍 gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换,既可以使用 LoadHTMLGlob() 或者 LoadHTMLFiles() 方法加载模板文件, 也可以使用自定义模板渲染器。 案例 加载 templates 目录下的文件 加载多个子目录下的文件 自定义模板渲染器 自定义模板功能 说明

脚步不能达到的地方,眼光可以达到;眼光不能达到的地方,精神可以飞到 3281

Ansys Circuit新手必看:IBIS模型导入时,Pin Import和Buffer Import到底怎么选?

本文详细解析了Ansys Circuit中IBIS模型导入时Pin Import与Buffer Import的选择策略,帮助SI/PI工程师根据仿真需求做出正确决策。通过对比两种方式的特性差异和应用场景,提供实用的选择指南和性能优化建议,提升信号完整性仿真效率。

weixin_26846533的博客 262

RK3568 开发实战:手动构建 Linux 4.19 内核镜像与设备树优化

本文详细介绍了为RK3568开发板手动编译Linux 4.19内核的完整实战流程。从环境搭建、源码获取、内核配置,到设备树深度定制与优化,再到镜像打包与烧写,旨在帮助开发者脱离官方SDK依赖,实现对嵌入式Linux系统的完全掌控,提升硬件适配与性能优化能力。

weixin_29175469的博客 270

[golang gin框架] 2.Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务

Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务

资深系统架构,深耕高并发研发与 AI 大模型工程化落地。技术栈以 Python (AI/NLP/RAG/Agent) 与 Golang (高并发架构) 为双核心,兼具 PHP 大型应用经验。专注算法落地、复杂系统设计及团队技术赋能 9428

Ubuntu16.04下禁用scp、sftp和winscp

在上一篇博文《Ubuntu16.04 搭建FTP服务器,设置用户权限为只许上传、禁止下载和删除》中,我讲述了Ubuntu16.04下配置FTP,并且设定用户权限为只能上传数据,禁止下载和删除数据。这算在FTP层面封堵了服务器数据泄露的途径。 但是,Ubuntu系统的scp和sftp还是起作用的,理论上只要能用本地机器ping通服务器,就可以用scp和sftp下载数据,这还是存在数据泄露可能的,所...

HPC&Geophysics攻城狮 5737

【Golang】——Gin 框架中的模板渲染详解

模板渲染是一种动态生成 HTML 页面的技术。通过模板文件和动态数据的结合,Web 应用可以为每个用户生成不同的内容。数据与视图分离:HTML 文件专注于页面结构和样式,动态数据由代码逻辑控制。代码复用:通过模板复用页面组件(如导航栏、页脚等)。维护便利:HTML 和业务逻辑分开,降低了代码维护的复杂性。本篇博客从模板渲染的基础配置,到嵌套模板、静态文件服务,以及完整项目实战,全面展示了 Gin 框架在动态网页开发中的强大能力。

Linke的博客 2800

开源滑翔伞升降速度表:基于STM32与传感器融合的DIY飞行仪表

传感器融合是现代嵌入式系统与物联网设备中的核心技术,它通过整合多个传感器的数据,利用滤波与估计算法,获得比单一传感器更精确、更可靠的环境感知能力。其技术价值在于提升系统的鲁棒性、精度和上下文理解能力,广泛应用于无人机导航、可穿戴设备、工业监测及智能驾驶等领域。本文聚焦于一个具体的工程实践案例——开源多功能滑翔伞升降速度表(Open-Vario),该项目巧妙地运用了**卡尔曼滤波器**进行气压与GNSS数据的融合,以精确计算升降率,并基于**FreeRTOS**实时操作系统构建了一个稳定、可扩展的嵌入式平台,

weixin_33657398的博客 178

【BLE】HID设备开发实战:从自拍杆到复合设备的蓝牙控制方案

本文深入解析了BLE HID(低功耗蓝牙人机接口设备)的开发实战,从蓝牙自拍杆的工作原理切入,详细阐述了HID Report Map的设计与实现。通过拆解自拍杆、键盘、鼠标等案例,指导开发者如何利用BLE的低功耗与即插即用特性,构建从单一功能到键盘鼠标复合设备的完整蓝牙控制方案。

weixin_29159613的博客 466

gin框架 HTML 模板加载,渲染 使用详解和总结

本文从gin框架中html模板的加载,渲染和使用,功能定义等方面详细讲解了gin框架中的html模板渲染工程和使用注意事项等。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 3150

生成模型实战 | 基于Transformer生成音乐

本文介绍了基于Transformer架构的音乐生成方法,将音乐视为一系列事件序列进行处理。与将音乐表示为多维图像的MuseGAN不同,该方法使用类似GPT的仅解码器模型,基于先前事件预测下一个音乐事件。模型使用MIDI格式的钢琴音乐数据,通过分词处理将音符转换为note-on、note-off、time-shift和velocity四种事件类型,共388个独特词元,映射为索引序列后输入网络。训练完成后,可通过调整温度参数控制生成音乐的新颖性,从而创作出风格类似训练数据且连贯逼真的音乐作品。

盼小辉丶的博客 5908

4-Gin HTML 模板渲染 --[Gin 框架入门精讲与实战案例]

下面是使用 Gin 框架在 Go 语言中进行 HTML 模板渲染的四个示例。每个示例都包含了必要的注释来解释代码的作用。

桃园码工的博客 1768

在 RAP 中把业务对象“搬到网口上”:service definition 与 service binding 的全流程、范式与实战

本文解析了SAP ABAP开发中service definition和service binding的关键作用。service definition负责选择要暴露的CDS实体和行为,形成服务模型;而service binding则将服务绑定到具体协议(如OData),生成可访问的端点。两者分离带来三大优势:支持同一模型多重发布、降低环境迁移耦合度、强化安全治理。文章通过预订业务对象的端到端示例,展示了如何从CDS建模到生成Fiori Elements预览。最后以售后工单业务为例,说明这种架构如何支持内外服务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

基于matlab的CNN验证码识别系统(UI界面版)

基于matlab的CNN验证码识别系统(UI界面版),CNN验证码识别系统包括数据集处理、模型搭建、模型训练、界面设计与实现

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 488

【Gin】初识Gin框架,模板基本语法

Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。

大河之犬的博客 3422

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Golang Gin 实战(十一)| HTML模板渲染

终于又到一个重头戏了。在整个服务端开发中,一个是API,一个就是网页,当前的API大部分都是通过JSON提供了,而网页就是通过HTML提供了。所以对于这么大的需求,Gin当然不会忘记,为...

flysnow_org的博客 5653

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Gin模板渲染

有两种选择,一种是只有一个返回值,还有一种是有两个返回值,但是第二个返回值必须是error类型的。这两种函数的区别是第二个函数在模板中被调用的时候,假设模板函数的第二个参数的返回不为空,则该渲染步骤将会被打断并报错。如果赋值给两个变量,则第一个变量是索引值(array/slice是数值,map是key),第二个变量是当前正在遍历元素的值。首先,template包创建新的模板的时候,支持.Funcs方法来将自定义的函数集合导入到该模板中,后续通过该模板渲染的文件均支持直接调用这些函数。...

go|Python的个人博客 1537

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Gin之渲染HTML模板

Gin之渲染HTML模板

weixin_52690231的博客 1786

Go Web下gin框架的模板渲染

Gin框架的设计目标是保持简单和易于使用,同时提供足够的灵活性和扩展性,使开发人员能够根据项目的需求进行定制。它提供了许多有用的功能,如中间件支持、路由组、请求参数解析、模板渲染等,使开发人员能够快速构建高效的Web应用程序。

luyoung0001@gmail.com的博客 1262

gin跳转到html,Gin 使用示例(十六):HTML 视图模板渲染

Gin 使用示例(十六):HTML 视图模板渲染由 学院君 创建于9个月前, 最后更新于 9个月前版本号 #11952 views0 likes0 collects在 Gin 框架中,可以使用 LoadHTMLGlob() 或 LoadHTMLFiles() 来渲染 HTML。单目录如果要加载的 HTML 文件位于同一个目录下,示例代码如下(src/gin-demo/examples/html.g...

weixin_34355348的博客 3833

4.Gin HTML 模板渲染

4.Gin HTML 模板渲染Gin HTML 模板渲染1. 全部模板放在一个目录里面的配置方法创建用于渲染的模板htmltemplates/index.html<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>Title</t...

DevOps海洋的渔夫@专栏 847

golang学习之gin(二):模板渲染、数据渲染

文章目录一、模板渲染:1. 一级模板:2. 多级模板:2.1 多级目录模板指定:二、静态文件的使用:三、数据渲染:1. 字符串渲染:2.结构体渲染:3. 数组渲染:4. 结构体数组渲染:5. map渲染:6. map+struct渲染:7. 切片渲染: 一、模板渲染: 1. 一级模板: ./main.go package main import ( "github.com/gin-gonic/gin" ) func index(ctx *gin.Context) { // HTML(code

浅弋、璃鱼的博客 5181

Gin模板语法

USER世界

JUIU9527的博客 1154
上一篇: 前端架构: 脚手架框架之commander从基础到高级应用教程
下一篇: Gin框架: 路由解析与分组详解
Wang's Blog
博客等级 码龄12年 7436粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值