web-dev-qa-db-ja.com

テンプレートとしてファイルを読み取り、実行して書き戻します

設定ファイルで定義されている変数を挿入できるCSSファイルを解析しようとしています。現在、この関数は次のことを行います。

  1. 指定されたパス引数に基づいてファイルを開きます
  2. ファイルの内容を解析します
  3. 構成変数を挿入してテンプレートを実行します
  4. レンダリングされたコンテンツを元のファイルではなくコンソールに書き込みます
_func parse(path string) {
    f, err := ioutil.ReadFile(path)

    if err != nil {
        log.Print(err)
        return
    }

    // Parse requires a string
    t, err := template.New("css").Parse(string(f))

    if err != nil {
        log.Print(err)
        return
    }

    // A sample config
    config := map[string]string {
        "textColor": "#abcdef",
        "linkColorHover": "#ffaacc",
    }   

    // Execute needs some sort of io.Writer
    err = t.Execute(os.Stdout, config)  

    if err != nil {
        log.Print("Can't execute ", path)
    }
}
_

私の問題は、template.Parse()は文字列としてコンテンツを必要とし、template.Execute()は引数として_io.Writer_を必要とすることです。 _io.Writer_インターフェイスを実装するファイルオブジェクトを返すos.Open()でファイルを開こうとしました。しかし、Parse()で使用するために、そのようなファイルオブジェクトからファイルのコンテンツを文字列として取得するにはどうすればよいですか?

10
user3147268

ParseFiles を使用してテンプレートを解析します。このコードは基本的に、質問のようにReadFile、template.New、およびParseを呼び出すのと同じことを行いますが、より短いです。

t, err := template.ParseFiles(path)
if err != nil {
    log.Print(err)
    return
}

os.Create を使用して出力ファイルを開きます。

f, err := os.Create(path)
if err != nil {
    log.Println("create file: ", err)
    return
}

ファイルはio.Writerです。開いているファイルに対してテンプレートを直接実行できます。

err = t.Execute(f, config)
if err != nil {
    log.Print("execute: ", err)
    return
}

完了したらファイルを閉じます。

f.Close()

遊び場での完全な実例。

24
Cerise Limón