2016-08-03 9 views
2

私は新しい概念を証明しようとしています。そのため、私はこのように、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)) 

機能を除いてOK取り組んでいます

これは、おそらく私がこの問題に最善のアプローチを使用していないと思っています。

答えて

4

戻り値は、通常のパラメータとメソッド受信者のように、関数本体にスコープされます。スペックに言及

:彼らは範囲に含まれていない関数の外Declarations and Scope:

The scope of an identifier denoting a method receiver, function parameter, or result variable is the function body.

は、あなたがそれらを参照することはできません。あなたのケースでは

非常に簡単な修正は、関​​数を呼び出す必要があること、そしてそれは、あなたがそれを使用することができ返すものです(あなたは、それに沿って渡す変数などに割り当てることができます):

var Templates = template.Must(template.ParseFiles(ExtractFileNames()...)) 

ここで注目すべきことの1つは省略記号と呼ばれる...です。 ExtractFileNames()は、スライスを返しますが、可変引数パラメータtemplate.ParseFiles()ているので、それが必要となります。可変引数パラメータ(の値として、...あなたはスライスを渡したいコンパイラを教えてくれますようにするため

func ParseFiles(filenames ...string) (*Template, error) 

を「爆発」とvaradicリストの単一の要素ではありません...)。これに関する詳細は、Passing arguments to ... parameters

+0

はい。私は私の質問をより明確にするためにタイトルを変更しました:それを外部で働かせる方法。ありがとう! –

+0

@PauloJaneiro編集された答えを参照してください:単純に関数を呼び出すと、値が返されます。 – icza

+0

両方の問題で100%クリアされました!どうもありがとう。 –

関連する問題