为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
神不在的星期二 2021-11-08 15:32:51
我正在尝试解析 CSS 文件,其中可以注入配置文件中定义的变量。目前该功能执行:根据给定的路径参数打开文件解析文件的内容通过注入配置变量来执行模板将渲染的内容写入控制台而不是原始文件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()?
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-11-08
?
哔哔one

TA贡献1854条经验 获得超8个赞

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

}


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信