我刚开始使用Go进行简单的Web编程项目,但我无法完全弄清楚如何在单个函数中实现简单的预计算。这是我在OCaml中做的相当频繁,如:为Go中的函数预计算简单值
(* maybe render_page is a handler function for an HTTP server or something *)
let render_page =
(* let's say that Template.prepare takes a template string and returns its compiled representation *)
let templ = Template.prepare "user: {{.}}, group: {{.}}" in
(* return an anonymous function *)
fun user group ->
templ [user; group]
对于那些不熟悉OCaml的,什么上面发生的是我的名字render_page
结合,它有两个参数,想必返回网页的功能,但在内部,我首先创建了一个到templ
的本地绑定(该绑定仅在render_page
的定义中可见,并且计算仅发生一次),然后在匿名函数内使用该绑定,这是绑定到render_page
的实际值。所以当你拨打render_page
时,templ
不会每次重新编译:它只是从闭包环境中获取。
在Go中有这样一个常见的模式吗?我想尽可能地避免全局变量。我意识到,“全局”变量可能局限于包的名称空间,这正是我目前正在做的,但我想限制这些预先计算的表达式的可见性仅限于它们所需的函数。
谢谢!
Go没有函数本地静态变量。如果你想在一个函数的执行之间共享一个可变值,它必须是一个全局变量。您可以将函数局部常量用于不可变值,但常数仅限于内置类型。 – Adrian
您也可以使变量成为结构体的成员,并根据您的用例将该函数转换为该结构体上的方法。您仍然需要确保重新使用该结构的同一个实例。就个人而言,我只会使用全球。 – Adrian