如何在函数外部进行未定义的返回变量

时间:2016-08-03 00:12:26

标签: go

我是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

这让我觉得我可能没有使用最好的方法解决这个问题。

1 个答案:

答案 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