Go模板中如何移除href内文件扩展名仅展示无后缀文件名?
Go模板中去除文件扩展名的实现方式
Go原生模板没有内置直接去除文件扩展名的函数,可以根据你的使用场景选择以下方案:
方案1:注册自定义模板函数(通用推荐)
这是适配性最强的方案,不受扩展名长度、类型限制,只需要在解析模板前将处理逻辑注册为模板函数即可,依赖Go标准库能力不需要额外引入第三方包。
首先在Go代码中注册自定义函数:
import ( "html/template" "path/filepath" ) // 移除文件扩展名的处理函数 func trimFileExt(name string) string { extLen := len(filepath.Ext(name)) return name[:len(name)-extLen] } // 解析模板前将函数注入模板FuncMap tpl := template.Must(template.New("fileList").Funcs(template.FuncMap{ "trimExt": trimFileExt, }).ParseFiles("你的模板文件路径"))
之后直接在模板中调用注册好的trimExt函数即可,修改后的模板代码:
{{- range $val := .Filelist}} <li> <a href="{{$val}}"> {{ trimExt $val }} </a> </li> {{- end }}
针对你当前.graph后缀的场景,渲染后链接文本会直接输出1、2,符合预期。如果需要处理.tar.gz这类多段后缀,只需要调整trimFileExt函数内的截断逻辑即可。
方案2:固定后缀场景直接用模板内置能力
如果你的文件扩展名是固定值,且使用的模板环境已经内置了通用字符串处理函数(比如集成了sprig函数库的Hugo、各类Go静态站点工具),不需要修改后端Go代码,可以直接在模板内用trimSuffix函数裁剪固定后缀:
{{- range $val := .Filelist}} <li> <a href="{{$val}}"> {{ trimSuffix ".graph" $val }} </a> </li> {{- end }}
注意:纯原生Go模板没有内置算术运算函数,硬编码截断位置的写法仅适合文件名长度、后缀完全固定的极端场景,适配性极差,常规场景优先选择自定义函数的方案。
内容的提问来源于stack exchange,提问作者ascender
相关产品推荐
相关产品推荐

