猿问

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

我正在尝试解析 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作为参数。我试图打开os.Open()返回实现io.Writer接口的文件对象的文件。但是我怎样才能从这样的文件对象中以字符串的形式获取文件的内容,以便与 一起使用呢Parse()?


神不在的星期二
浏览 224回答 2
2回答

翻过高山走不出你

使用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()

哔哔one

这是我用 Cerise Limón 的答案制作的功能func createFileUsingTemplate(t *template.Template, filename string, data interface{}) error {    f, err := os.Create(filename)    if err != nil {        return err    }    defer f.Close()    err = t.Execute(f, data)    if err != nil {        return err    }    return nil}
随时随地看视频慕课网APP

相关分类

Go
我要回答