英文:
Read file as template, execute it and write it back
问题
我正在尝试解析CSS文件,其中可以注入在配置文件中定义的变量。目前该函数执行以下操作:
- 根据给定的路径参数打开文件。
- 解析文件的内容。
- 通过注入配置变量来执行模板。
- 将渲染后的内容写入控制台,而不是原始文件。
func parse(path string) {
f, err := ioutil.ReadFile(path)
if err != nil {
log.Print(err)
return
}
// Parse需要一个字符串作为参数
t, err := template.New("css").Parse(string(f))
if err != nil {
log.Print(err)
return
}
// 一个示例配置
config := map[string]string {
"textColor": "#abcdef",
"linkColorHover": "#ffaacc",
}
// Execute需要一个io.Writer作为参数
err = t.Execute(os.Stdout, config)
if err != nil {
log.Print("无法执行 ", path)
}
}
我的问题是template.Parse()
需要字符串作为内容,而template.Execute()
需要一个io.Writer
作为参数。我尝试使用os.Open()
打开文件,它返回一个实现了io.Writer
接口的文件对象。但是,我如何从这样的文件对象中获取文件的内容作为字符串,以便与Parse()
一起使用呢?
英文:
I'm trying to parse CSS files in which variables can be injected that are defined in a config file. Currently the function does:
- Opens the file based on the given path argument
- Parses the file's content
- Executes the template by injecting the config variable
- Writes the rendered content to the console instead of the original file
<!-- lang: go -->
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)
}
}
My problem is that template.Parse()
requires the content as string and template.Execute()
an io.Writer
as argument. I tried to open the file with os.Open()
which returns a file object that implements the io.Writer
interface. But how can I get the file's content as a string from such a file object in order to use it with Parse()
?
答案1
得分: 58
使用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()
英文:
Use ParseFiles to parse the template. This code basically does the same thing as calling ReadFile, template.New and Parse as in the question, but it's shorter.
t, err := template.ParseFiles(path)
if err != nil {
log.Print(err)
return
}
Use os.Create to open the output file.
f, err := os.Create(path)
if err != nil {
log.Println("create file: ", err)
return
}
A file is an io.Writer. You can execute the template directly to the open file:
err = t.Execute(f, config)
if err != nil {
log.Print("execute: ", err)
return
}
Close the file when done.
f.Close()
答案2
得分: 3
这是我根据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
}
英文:
Here is a function I made with Cerise Limón's answer
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论