我是Go的新手并试图做出一些概念证明。因此,我想将模板文件名传递给template.ParseFiles
,如下所示:
var Templates = template.Must(template.ParseFiles("views/edit.html", "views/view.html", "views/main.html"))
动态地做我想做的事:
func ExtractFileNames () (templateFileNames []string) {
files, _ := ioutil.ReadDir("./views")
for _, f := range files {
if strings.Contains(f.Name(), ".html") {
templateFileNames=append(templateFileNames, "views/" + f.Name())
}
}
return templateFileNames
}
var Templates = template.Must(template.ParseFiles(templateFileNames))
该功能正常工作,但我收到错误:
undefined: templateFileNames
这让我觉得我可能没有使用最好的方法解决这个问题。
答案 0 :(得分:4)
返回变量 - 就像普通参数和方法接收器一样 - 作用于函数体。
规范中提到:Declarations and Scope:
表示方法接收者,函数参数或结果变量的标识符的范围是函数体。
在功能之外,他们不在范围内,你不能参考它们。
在你的情况下,非常简单的修复是你必须调用函数,它返回什么,你可以使用它(你可以传递它,将它分配给变量等):
var Templates = template.Must(template.ParseFiles(ExtractFileNames()...))
这里要注意的一件事是...
称为省略号。这是必需的,因为ExtractFileNames()
返回切片,但template.ParseFiles()
具有可变参数:
func ParseFiles(filenames ...string) (*Template, error)
这样...
将告诉编译器你想要传递切片"爆炸",作为variadic参数的值(而不是例如可变参数列表中的单个元素)。 ..)。有关详情,请参阅规范:Passing arguments to ... parameters