如何使用go的template模版

news/2025/3/26 3:59:11/

 

tmpl, err = tmpl.New("page_content").Parse(fmt.Sprintf(`{{template "%s" .}}`, contentBlockName))
  1. 创建新块
    • tmpl.New("page_content"):在模板对象tmpl中定义一个新的、名为"page_content"的块。
    • 这个块是动态的,之前并不存在,是运行时根据传入的contentBlockName创建的。
  2. 填充内容
    • Parse(fmt.Sprintf({{template "%s" .}}, contentBlockName))
      • 使用fmt.Sprintf生成一个模板指令:{{template "home_content" .}}
      • 这个指令表示:在当前模板上下文中,渲染名为home_content的块,并将当前数据(.)传递给它。
    • 换句话说,home_content块的内容会被插入到page_content块中。
  3. 动态替换
    • 假设基础模板base.html中包含:
      <body>
      {{template "page_content" .}}
      </body>
    • 在执行模板时,page_content块会被替换为home_content块的内容。

为什么复制模板

  • 避免污染原始模板
    • 如果不克隆模板,而是直接修改原始模板,会影响后续的模板调用。
    • 例如,如果在一次请求中动态定义了page_content块,其他请求可能也会无意中使用这个定义,导致逻辑混乱。
  • 支持并发调用
    • 在高并发场景中,多个请求可能同时调用renderTemplate函数。
    • 每个请求都需要一个独立的模板实例,以避免数据竞争和冲突。

整体流程

  • 模板加载
    • 加载基础模板(base.html)和页面模板(如home.html)。
    • 页面模板中定义了具体的块(如home_content)。
  • 动态块定义
    • 克隆模板对象,创建一个新的块(如page_content)。
    • 动态填充这个块的内容,指向传入的contentBlockName(如home_content)。
  • 模板渲染
    • 使用基础模板base.html进行渲染。
    • 在渲染过程中,page_content块会被替换为home_content块的内容,最终填充到HTML页面的<body>区域。

总结

通过动态创建和填充块,这种方法实现了模板的灵活性和可复用性:

  • 灵活性:可以根据不同的请求动态渲染不同的内容块。
  • 可复用性:基础模板保持不变,页面模板可以定义多个块,按需替换。

这种设计模式在需要动态生成HTML页面的Web应用中非常常见,能够有效提升开发效率和代码可维护性。


http://www.ppmy.cn/news/1583127.html

相关文章

深入剖析Java虚拟机(JVM):从零开始掌握Java核心引擎

&#x1f4cc; 引言&#xff1a;为什么每个Java开发者都要懂JVM&#xff1f; 想象你是一名赛车手&#xff0c;Java是你的赛车&#xff0c;而JVM就是赛车的引擎。 虽然你可以不关心引擎内部构造就能开车&#xff0c;但要想在比赛中获胜&#xff0c;必须了解引擎如何工作&#…

3:库的增删查改,编码,备份恢复

1. 数据库增删查改&#xff1a; show databases; //展示数据库 create database xxx; //创建数据库xxx&#xff0c;本质在var/lib/mysql下创建一个xxx目录 drop database xxx; // 删除数据库xxx&#xff0c;本质在var/lib/mysql下删除xxx目录 create database xxx charsetutf8…

线程池实现学习笔记1

线程池实现学习笔记 今天花了一些时间学习和实现了线程池&#xff0c;收获颇丰。在这里记录一下自己的学习心得&#xff0c;希望对大家也有帮助。 为什么需要线程池&#xff1f; 在实际开发中&#xff0c;如果每个任务都创建一个新线程&#xff0c;当任务数量很大时会带来以…

SQL Optimization

SQL Optimization &#xff08;SQL 优化&#xff09; 1) * && field SELECT * from sys_user SELECT USER_ID, USER_NAME, EMAIL FROM SYS_USER; 栗子&#xff1a; 48.664s 142877rows 6.194s 142877rows 2&#xff09;UNION && UNION ALL …

单链表的查找和插入,删除操作

1.单链表的查找 snode* slistfind(snode* stlheap, stltype x) {while (stlheap){if (stlheap->data x){return stlheap;}stlheap stlheap->next;}return NULL; } 2.单链表的插入操作 2.1在指定位置之前插入节点 void slistinsert(snode** stlheap, snode* pos, stl…

Linux:基础IO---文件描述符

文章目录 1. 前言1.1 C语言文件知识回顾 2. 文件2.1 文件基础知识 3. 被打开的文件3.1 以C语言为主&#xff0c;先回忆一下C文件接口3.2 过渡到系统&#xff0c;认识文件系统调用3.3 访问文件的本质3.4 重定向&&缓冲区 序&#xff1a;在深入了解了进程的内容后&#xf…

游戏引擎学习第172天

总结今天的计划 这次的项目我们没有使用任何游戏引擎或者第三方库&#xff0c;而是完全自己动手编写。这种方式可能没有经济效益&#xff0c;但我认为每个人都应该有一次亲身经历&#xff0c;了解开发一款游戏时所涉及的所有内容。这样能让开发者更加灵活&#xff0c;能够做很…

数学建模:MATLAB卷积神经网络

一、简述 卷积神经网络是一种处理具有网格结构数据的深度学习模型&#xff0c;由输入层、卷积层、池化层、全连接层、输出层组成。 输出层&#xff1a;将图像转换为其对应的由像素值构成的二维矩阵&#xff0c;并存储二维矩阵 卷积层&#xff1a;提取图像的底层特征&#xf…