0

0

在 .go 文件中运行函数和在 Go 模板中调用它有什么区别?

WBOY

WBOY

发布时间:2024-02-09 12:51:17

|

536人浏览过

|

来源于stackoverflow

转载

在 .go 文件中运行函数和在 go 模板中调用它有什么区别?

在Go语言中,我们可以在.go文件中定义函数并直接调用它们,也可以在Go模板中调用函数。然而,在两种情况下,函数的运行方式和调用方式存在一些区别。在.go文件中运行函数时,我们可以直接通过函数名和参数列表来调用函数,而在模板中调用函数时,我们需要使用{{}}语法来包裹函数调用,并将函数名作为模板指令的一部分。此外,模板中的函数调用可以在模板渲染过程中动态执行,而在.go文件中运行函数时,函数的执行是静态的,不会受到模板渲染的影响。因此,根据具体的使用场景和需求,我们可以选择适合的方式来运行函数和调用它们。

问题内容

使用 text/template 包中的 template.funcmap,您可以直接从 go 模板文件中访问函数。

假设以下场景:在用户概述页面的处理程序中,调用函数 getallusers 并使用 executetemplate 将用户对象传递给模板:

func index(w http.responsewriter, r *http.request) {
  users, err := model.getallusers()
  if err != nil {
    render50x()
    return
  }

  data := make(map[string]interface{})
  data["userlist"] = users

  render(w, r, data, "layout", "index")
}

这与将函数传递给模板并在那里执行它相同吗?

var funcs = template.funcmap{
  "getallusers": model.getallusers,
}

// func render
t := template.new("render").funcs(funcs)
if err := template.must(t.parsefs(viewsfs, files...)).executetemplate(w, layout, data); err != nil {
  log.println("error executing template:", err.error())
}

{{ range getAllUsers }}
  {{ .DisplayName }}
{{ end }}

这两种方法有区别吗?

解决方法

如果可以从模板中调用该函数,那就是一样的。一些差异:

刺鸟创客
刺鸟创客

一款专业高效稳定的AI内容创作平台

下载

如果你在Go中调用它,则不需要注册该函数。有时您无法访问模板解析来注册函数,因此这是唯一的方法(不要忘记:您必须在解析模板之前注册函数)。

此外,如果你在 Go 中调用它,你对它有更多的“控制”:你可以从恐慌中恢复,你可以预处理结果,并且你可以在其他 Go 代码中重用它。您还可以根据结果选择不执行模板,或者执行模板中可能无法(轻松)表达的其他操作。

函数的结果也可能不容易渲染。例如。它可能不是 string,或者可能没有 String() string 方法。因此,可能需要一些额外的 (Go) 逻辑将结果转换为人类可读的格式,这在模板中可能不可用,或者可能需要注册更多函数。

另请注意,并非所有函数都可以从模板注册和调用。可调用函数最多可以有 2 个返回类型,秒数只能是 error。从 Go 中,您可以调用“任何”函数并仅传递您需要的结果。如果函数有参数,您还必须将它们作为数据传递给模板执行(这样您就可以在调用函数时将它们传递到模板中)。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

279

2023.10.25

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

444

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.10.13

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

697

2023.10.26

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

191

2024.02.23

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

8

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.4万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

Go 教程
Go 教程

共32课时 | 3.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号