读取文件作为模板,执行并写回

use*_*268 9 io templates file go

我正在尝试解析CSS文件,其中可以注入在配置文件中定义的变量.目前该功能有:

  1. 根据给定的路径参数打开文件
  2. 解析文件的内容
  3. 通过注入config变量来执行模板
  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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是template.Parse()需要的内容串和template.Execute()一个io.Writer作为参数.我试图打开文件os.Open(),返回一个实现该io.Writer接口的文件对象.但是如何将文件的内容作为字符串从这样的文件对象中获取以便与其一起使用Parse()?

Cer*_*món 24

使用ParseFiles来解析模板.这段代码基本上与调用ReadFile,template.New和Parse一样,与问题相同,但它更短.

t, err := template.ParseFiles(path)
if err != nil {
    log.Print(err)
    return
}
Run Code Online (Sandbox Code Playgroud)

使用os.Create打开输出文件.

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

文件是io.Writer.您可以直接将模板执行到打开的文件:

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

完成后关闭文件.

f.Close()
Run Code Online (Sandbox Code Playgroud)

在操场上完成工作示例.