golang html/template模板中使用自定义函数/方法的2种方法总结
在golang的html/template模板库中我们如果希望在视图文件中调用自定义的函数 或者方法可以通过以下2种方法实现:
1. 调用自定义函数
可通过将自定义的函数加入到 template.FuncMap中,然后再使用 template.New("xxx.html").Funcs(funcMap)来在指定的模板中使用自定义函数,如:
func MyFormat(t time.Time) string {//t, _ := time.Parse(DF, time.Now().GoString()) // 演示 将字符串解析为时间对象tstr := fmt.Sprintf("%v", t.Format(DF))return tstr // 返回格式后的时间字符串
}func indexHandler(w http.ResponseWriter, r *http.Request) {// 将自定义的函数放入到模板的FuncMap中fmap := template.FuncMap{"mfc": MyFormat}tpl := template.New("abc.html").Funcs(fmap) // 将自定义函数绑定到模板函数map里面tpl, err := tpl.ParseFiles("views/abc.html") if err != nil || tpl == nil {w.WriteHeader(http.StatusNotFound) // 返回404错误 http.StatusNotFoundw.Write([]byte(fmt.Sprintf("%v", err))) // 将错误信息输出到浏览器return // 这里必须中断后面的代码执行}// tpl.Execute 将解析后的模板和数据绑定tpl.Execute(w,"hello world")
}
2. 调用自定义的方法
这个最简单,不需要使用FuncMap绑定,直接将要调用的对象作为数据data传入模板,然后直接调用对象的方法即可,如:
// 创建一个自定义对象
type DemoFlighter struct {Name string `json:"name"`
}// 对象DemoFlighter的方法
func (s *DemoFlighter) Flight(dst string, n int) string {return fmt.Sprintf("%v正在以每秒%v公里的速度向%v前进!\n", s.Name, dst, n)
}func indexHandler(w http.ResponseWriter, r *http.Request) {tpl, _ := tpl.ParseFiles("views/abc.html") // 定义并初始化一个数据对象data 在视图文件中可通过 .字段名 来访问这里定义的字段,如 .Title 就可访问这里的Title字段// 如果是在模板中访问对象的方法则调用语法为 .Obj.Method [参数] 如: .Ts.Year 即可访问Ts对象中的Year函数 注意不要小括号var data = struct {Title stringTs time.TimeFlighter *DemoFlighter}{Title: "GO模板自定义函数使用示例", Ts: time.Now(), Flighter: &DemoFlighter{Name: "Alex"},}// tpl.Execute 将解析后的模板和数据绑定if err = tpl.Execute(w, data); err != nil {w.WriteHeader(http.StatusInternalServerError) // 返回500 http.StatusInternalServerError错误w.Write([]byte(fmt.Sprintf("%v", err))) //输出错误到浏览器return}
}
注意,golang中函数和方法可是不同的东西,虽然他们的实现都一样,可是定义却不一样!
main启动入口方法
func main() {// :8090 表示服务绑定在当前所有可用IP上,端口为8090server := http.Server{Addr: ":8090"}// 将 / 路由请求交给 indexHandler 这个函数来处理http.HandleFunc("/", indexHandler) // 路由配置//启动服务if err := server.ListenAndServe(); err != nil {fmt.Println("服务启动失败:", err)}
}
视图文件views/abc.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{.Title}}</title>
</head><body>当前时间: {{.Ts }}<br>{{.Ts.Year}}<br>{{.Ts.Month}}<br>{{.Ts.Day}}<br>自定义函数格式后的时间: {{ mfc .Ts }}<br><h2>对象调用示例</h2>对象属性调用: {{.Flighter.Name }}<br>对象方法调用示例: 多个参数以空格分隔<br>{{.Flighter.Flight "昆明" 888 }}<br>
</body>
</html>
总结:
第一种方式调用自定义的函数 需要使用template.FuncMap绑定等操作,且不方便扩展和维护,仅适合对于通用的工具类函数进行调用, 如非通用工具类调用,则推荐使用 调用自定义方法的方式来进行自定义方法的调用
相关文章:
golang html/template模板中使用自定义函数/方法的2种方法总结
在golang的html/template模板库中我们如果希望在视图文件中调用自定义的函数 或者方法可以通过以下2种方法实现: 1. 调用自定义函数 可通过将自定义的函数加入到 template.FuncMap中,然后再使用 template.New("xxx.html").Funcs(funcMap)来在…...
浅析vue3自定义指令
vue3中可以像下面这样使用自定义指令。 这里我们只是定义了一个vFoucs变量,vue怎么知道这是一个指令呢? 这是因为约定大于配置,vue3中有这样一个约定(截图来自官方文档): 注意这里说的是驼峰命令&#x…...
后仿真中的关于延时问题(延迟类型选择和脉冲控制)
目录 通过前面的文章提到,从物理特性角度出发,仿真中存在两种延时:惯性延时和传输延时。那么,实际仿真电路过程中,我们究竟选择的哪种模式呢? 一 指定传输延迟类型 传输延迟类型不是默认的延迟类型。我们需要显示指定它。 1.1 module-path delay VCS 仿真中添加如下三…...
欧拉公式e^(ix)=(cos x+isin x)
啊,哈喽,小伙伴们大家好。我是#张亿,今天呐,学的是欧拉公式 在不同的学科中有着不同的含义和应用。在复变函数中,欧拉公式表述为e^(ix)(cos xisin x),其中e是自然对数的底,i是虚数单位&#x…...
Android 获取已安装应用、包名、应用名、版本号、版本名
1、相关代码 List<ApplicationInfo> installedApps getPackageManager().getInstalledApplications(0);for (ApplicationInfo appInfo : installedApps) {CharSequence getAppName getPackageManager().getApplicationLabel(appInfo);String appNamegetAppName.toStrin…...
2024数学建模深圳杯B题成品论文43页word+完整可视化结果图+可执行代码
【无水印word】2024深圳杯B题成品论文43页(附带1-4小问完整py解题代码思路)https://www.jdmm.cc/file/2710664 批量工件并行切割下料优化研究 摘 要 本研究针对批量工件并行切割下料问题展开了深入的探讨与分析。通过建立数学模型和运用优化算法&…...
达梦(DM) SQL查询及联合查询
达梦DM SQL查询及联合查询 查询结果排序多表联合查询 这里继续讲解DM数据库的Sql查询操作 查询结果排序 为提高查询结果可读性,我们可以对查询结果按照一定顺序排列,或者也可以将列名替换成数字,例如 ORDER BY 1 DESC,意思是按第…...
【重生之我在学Android】WorkManager (章一)
相关文章 【重生之我在学Android原生】ContentProvider(Java) 【重生之我在学Android原生】Media3 【重生之我在学Android】WorkManager (章一) 前言 官方文档 官方推荐 - 前台服务、后台服务都可以使用WorkManger来实现 案例 语言:JA…...
【强训笔记】day23
NO.1 思路:直接计算结果,先计算怪物可以抗几次攻击,再计算勇士受到的伤害,如果勇士的攻击力大于等于怪物的血量,那么就可以击杀无数只,如果勇士的血量正好是受到攻击的整数倍,那么击杀的怪物数…...
C语言-STM32:介绍PWM,并使用PWM实现呼吸灯
1、什么是PWM PWM,全称为Pulse Width Modulation,中文名为脉冲宽度调制。这是一种模拟控制技术,通过改变脉冲信号的宽度来表征一个连续变量的平均值,通常用于对模拟信号的数字化控制,特别是在功率转换和信号处理中非常…...
SpringBean详解
文章目录 概述Spring获取Bean的流程依赖注入bean的作用域Spring 中的 Bean 是线程安全的吗Spring如何处理线程并发问题bean 的自动装配和方式Resource和Autowired的区别bean的自动装配bean的生命周期BeanFactoryBeanFactory 常用的实现类有哪些BeanFactory与FactoryBean的不同A…...
hive获取这周五到下周四的区间,周一到周日的区间
-- 获取每个日期所在周期的开始和结束时间 SELECTcreated_date AS date_in_period,CASEWHEN date_format(created_date, u) < 5 THEN date_sub(created_date, cast(date_format(created_date, u) AS INT) 2)ELSE date_sub(created_date, cast(date_format(created_date, u)…...
Iterable与Iterator
Iterator public interface Iterator<E> {} terator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下: forEachRemaining(Consumer<? super E> action):为每个剩余元素执行给…...
免费Premiere模板,几何图形元素动画视频幻灯片模板素材下载
Premiere Pro模板,几何图形元素动画视频幻灯片模板 ,组织良好,易于自定义。包括PDF教程。 项目特点: 使用Adobe Premiere Pro 2021及以上版本。 19201080全高清。 不需要插件。 包括帮助视频。 免费下载:https://prmu…...
数据结构与算法学习笔记九---循环队列的表示和实现(C++)
目录 前言 1.为什么要使用循环队列 2.队列的顺序存储方式的实现 1.定义 2.队列初始化 3.销毁 4.清空队列 5.队列是否为空 6.队列长度 7.队头 8.入队 9.出队 10.遍历队列 11.完整代码 3.参考资料 前言 这篇文章介绍循环队列的表示和用法。 1.为什么要使用循环队…...
Mysql获取当前时间
1、今天开始时间和结束时间 SELECT DATE_FORMAT(NOW(),’%Y-%m-%d 00:00:00’) AS ‘今天开始’; SELECT DATE_FORMAT(NOW(),’%Y-%m-%d 23:59:59’) AS ‘今天结束’;2、昨天的开始时间和结束时间 SELECT DATE_FORMAT( DATE_SUB(CURDATE(), INTERVAL 1 DAY), ‘%Y-%m-%d 00:…...
计算机服务器中了locked勒索病毒怎么解决,locked勒索病毒解密恢复工具
在网络技术飞速发展的时代,通过网络开展各项工作业务成为众多企业的首选,网络也为企业的生产运营提供了极大便利,大大提升了企业办公效率,但是利用网络避免不了网络威胁的存在,数据安全问题一直是企业关心的主要话题。…...
基于springboot实现的在线动漫信息平台
开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven…...
C# Winform+Halcon结合标准视觉工具
介绍 winform与halcon结合标准化工具实例 软件架构 软件架构说明 基于NET6 WINFORMHALCON 实现标准化视觉检测工具 集成相机通讯 集成PLC通讯 TCP等常见通讯 支持常见halcon算子 图形采集blob分析高精度匹配颜色提取找几何体二维码提取OCR识别等等 。。。 安装教程 …...
英语单词量测试
网址:https://preply.com/en/learn/english/test-your-vocab 测试结果: 细节:英语母语者有20000-35000个单词的词汇量,8岁孩子的词汇量在8000个左右。而不是我们教育系统里说的,6000个单词足够用了。足够用࿰…...
SenseVoice Small模型可解释性:注意力权重可视化与关键语音片段定位
SenseVoice Small模型可解释性:注意力权重可视化与关键语音片段定位 1. 项目背景与意义 语音识别技术在日常生活中的应用越来越广泛,从智能助手到会议转录,从语音输入到多媒体内容处理,都离不开高效准确的语音转文字服务。Sense…...
手柄不兼容PC游戏?试试ViGEmBus的虚拟控制器仿真技术
手柄不兼容PC游戏?试试ViGEmBus的虚拟控制器仿真技术 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否遇到过这样的情况:新买的…...
别再死记硬背了!用MATLAB 5分钟搞定控制系统的稳定裕度计算(附代码)
用MATLAB高效计算控制系统稳定裕度的工程实践指南 在自动控制系统的设计与分析中,稳定裕度是评估系统鲁棒性的关键指标。传统手工计算不仅耗时费力,还容易出错。本文将展示如何利用MATLAB这一强大工具,在5分钟内完成从传递函数定义到稳定裕度…...
告别传统知识蒸馏:用‘逆向蒸馏’在MVTec数据集上实现98.5%的异常检测精度
逆向蒸馏:工业质检场景下的异常检测新范式 在工业质检领域,异常检测一直是计算机视觉技术落地的核心挑战之一。传统方法往往受限于样本不平衡、缺陷类型多样等问题,而基于深度学习的方案又面临标注成本高、泛化能力不足的困境。CVPR 2022提出…...
Tencent Hunyuan3D-1.0模型蒸馏实践:从std版本压缩出移动端可用的轻量模型
Tencent Hunyuan3D-1.0模型蒸馏实践:从std版本压缩出移动端可用的轻量模型 【免费下载链接】Hunyuan3D-1 腾讯开源的Hunyuan3D-1项目,创新提出两阶段3D生成方法,实现快速、高质量的文本到3D和图像到3D转换,融合Hunyuan-DiT模型&am…...
C标准库缓冲区溢出问题与安全编程实践
1. C标准库缓冲区溢出问题概述缓冲区溢出是C语言开发中最常见的安全漏洞之一。作为一名有十年经验的嵌入式开发者,我见过太多由于不当使用标准库函数导致的崩溃和安全问题。缓冲区溢出通常发生在程序向固定大小的缓冲区写入超过其容量的数据时,多余的数据…...
C++ 内存管理:从unique_ptr到内存泄漏
引言 在C++编程中,智能指针是管理动态内存的重要工具。它们通过自动管理内存分配和释放,极大减少了程序员的手动管理负担。然而,尽管unique_ptr被设计为一个所有权唯一的智能指针,它仍然可能导致内存泄漏或资源循环引用。本文将通过一个实际例子来探讨unique_ptr如何在不经…...
ai辅助部署openclaw:让快马智能适配ubuntu环境与反爬策略
AI辅助部署OpenClaw:让快马智能适配Ubuntu环境与反爬策略 最近在尝试用OpenClaw抓取一些动态加载的网站数据,发现直接部署基础版本根本行不通。目标网站不仅有动态渲染的内容,还设置了各种反爬机制。好在发现了InsCode(快马)平台的AI辅助开发…...
三菱现代自动擦窗机器人PLC软件:后发产品介绍及技术细节
三菱 现代自动擦窗机器人PLC软件 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面 界面多种组态可供选择上周刚帮一个三菱现代贴牌擦窗机的小客户把新软件迭代完,顺便攒了一套带人话解释的梯形图、不…...
Buzz:离线环境下音频转录与翻译的完整解决方案
Buzz:离线环境下音频转录与翻译的完整解决方案 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 在当今信息驱动的工…...
