如何在 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/templatetext/template 有 2 个不同的模板包。出于安全目的,html 更严格。如果您从不受信任的来源获得输入,则选择 html 可能是明智之举。

【讨论】:

我并不想打印它...不是只适用于打印吗? @TheRealFakeNews fmt.Sprintf 不打印任何内容,它返回一个字符串。 仅供参考,为了准确起见,rawJSON 是一个字节数组 然后在调用该函数之前将其转换为字符串。 s := string([]byte("foo")). @TheFool 我更新了我的答案。这样的事情可以接受吗?我想你误解了我的意思。我不需要转换成字符串。

以上是关于如何在 Go 中将变量插入到多行(反引号)字符串中?的主要内容,如果未能解决你的问题,请参考以下文章

js的反引号模板字符串方便了拼接字符串吗?

Golang入门到项目实战 | golang字符串

Go语言中的字符串处理

Go语言中的字符串处理

Go语言中的字符串处理

雪花存储过程:处理多行字符串和单引号