如何在 Go 中将变量插入到多行(反引号)字符串中?
Posted
技术标签:
【中文标题】如何在 Go 中将变量插入到多行(反引号)字符串中?【英文标题】:How to insert a variable in to a multiline (backtick) string in Go? 【发布时间】:2022-01-19 22:03:30 【问题描述】:我正在尝试将一个变量插入到我传递给字节数组的字符串中。我想要的是这样的:
myLocation := "foobar123"
rawJSON := []byte(`
"level": "debug",
"encoding": "json",
// ... other stuff
"initialFields": "location": $myLocation ,
`)
我知道这在 Go 中是不可能的,因为我从 JS 中获取了它,但我想做类似的事情。
使用@TheFool 的回答我已经做到了:
config := fmt.Sprintf(`
"level": "debug",
"encoding": "json",
"initialFields": "loggerLocation": %s ,
`, loggerLocation)
rawJSON := []byte(config)
【问题讨论】:
【参考方案1】:您可以使用任何类型的 printf。例如 Sprintf。
package main
import "fmt"
func main()
myLocation := "foobar123"
rawJSON := []byte(`
"level": "debug",
"encoding": "json",
// ... other stuff
"initialFields": "location": "%s" ,
`)
// get the formatted string
s := fmt.Sprintf(string(rawJSON), myLocation)
// use the string in some way, i.e. printing it
fmt.Println(s)
对于更复杂的模板,您还可以使用模板包。这样你就可以使用一些函数和其他类型的表达式,类似于 jinja2。
package main
import (
"bytes"
"fmt"
"html/template"
)
type data struct
Location string
func main()
myLocation := "foobar123"
rawJSON := []byte(`
"level": "debug",
"encoding": "json",
// ... other stuff
"initialFields": "location": " .Location " ,
`)
t := template.Must(template.New("foo").Parse(string(rawJSON)))
b := new(bytes.Buffer)
t.Execute(b, datamyLocation)
fmt.Println(b.String())
请注意,html/template
和 text/template
有 2 个不同的模板包。出于安全目的,html 更严格。如果您从不受信任的来源获得输入,则选择 html 可能是明智之举。
【讨论】:
我并不想打印它...不是只适用于打印吗? @TheRealFakeNewsfmt.Sprintf
不打印任何内容,它返回一个字符串。
仅供参考,为了准确起见,rawJSON 是一个字节数组
然后在调用该函数之前将其转换为字符串。 s := string([]byte("foo"))
.
@TheFool 我更新了我的答案。这样的事情可以接受吗?我想你误解了我的意思。我不需要转换成字符串。以上是关于如何在 Go 中将变量插入到多行(反引号)字符串中?的主要内容,如果未能解决你的问题,请参考以下文章