我有以下的全局字符串:
studentName := "Hi ? ,Welcome"
现在我想动态获取这个字符串。
func returnName(name string) string{
return studentName+name
}
这个函数应该返回字符串作为
Hi name,welcome.
如何在golang中实现从参数中获取名称并返回动态字符串的功能?
如果您想保持简单,您可能只需使用fmt.Sprintf
。
studentName := fmt.Sprintf("Hi, %s! Welcome.", name)
%s
部分将被 name
的值所替换。
text/template
包。
template
包仅解析一次您的模板,从中构建一棵树,在需要替换值时即时地构建输出。const templ = `Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
t := template.Must(template.New("").Parse(templ))
将输入数据准备为struct
或map
:
data := map[string]string{
"Name": "Bob",
"Place": "Home",
"ToBring": "some beers",
}
你可以通过 Template.Execute()
获取结果:
err := t.Execute(os.Stdout, data) // Prints result to the standard output
这是一个完整的可运行示例:(在Go Playground上尝试)
package main
import (
"os"
"text/template"
)
func main() {
data := map[string]string{
"Name": "Bob",
"Place": "Home",
"ToBring": "some beers",
}
t := template.Must(template.New("").Parse(templ))
if err := t.Execute(os.Stdout, data); err != nil { // Prints result to the standard output
panic(err)
}
// Now change something:
data["Name"] = "Alice"
data["ToBring"] = "a Teddy Bear"
if err := t.Execute(os.Stdout, data); err != nil {
panic(err)
}
}
const templ = `
Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
输出:
Hi Bob!
Welcome Home.
Please bring some beers
Hi Alice!
Welcome Home.
Please bring a Teddy Bear
将结果作为 string
获取:
如果您想要将结果作为 string
,您可以将结果写入 bytes.Buffer
并使用 Buffer.String()
方法获取 string
:
buf := bytes.Buffer{}
t.Execute(&buf, data)
var result string = buf.String()
完整的程序(在Go Playground上试试):
package main
import (
"bytes"
"fmt"
"text/template"
)
func main() {
data := map[string]string{
"Name": "Bob",
"Place": "Home",
"ToBring": "some beers",
}
fmt.Print(Execute(data))
}
var t = template.Must(template.New("").Parse(templ))
func Execute(data interface{}) string {
buf := bytes.Buffer{}
if err := t.Execute(&buf, data); err != nil {
fmt.Println("Error:", err)
}
return buf.String()
}
const templ = `
Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
您可以考虑使用函数 strings.Replace
return Replace(studentName, "? ", name, 1)
使用'1',它将替换在studentName
中找到的第一个"? "。
Replace返回studentName
的副本,并用name
替换"? "
。
这严格遵循原始问题(全局变量具有该精确内容)
studentName := "Hi %s ,Welcome"
),那么您可以像425nesp的answer中那样使用fmt.Sprintf()
。请注意保留HTML标签。return fmt.Sprintf(studentName, name)
%s
,字符串的默认格式。func returnName(name string) string {
buf := bytes.Buffer{}
buf.WriteString("Hi ")
buf.WriteString(name)
buf.WriteString(", welcome")
return buf.String()
}
或者
func returnName(name string) string {
return "Hi " + name + ", welcome"
}
?
)或者Sprintf函数。您还可以使用template.Template
与strings.Builder
组合:
package main
import (
"strings"
"text/template"
)
func returnName(name string) string {
t, b := new(template.Template), new(strings.Builder)
template.Must(t.Parse("Hi {{.}}, welcome.")).Execute(b, name)
return b.String()
}
func main() {
println(returnName("Akash"))
}
fmt.Sprintf
是最好的选择。 - Not_a_Golfer