我有以下全局字符串,
studentName := "Hi ? ,Welcome"
现在我想动态地取这个字符串
func returnName(name string) string{
return studentName+name
}
此函数应将字符串返回为
Hi name,welcome.
string应该从参数中取名,并返回动态字符串。在golang中实现它的最佳方法是什么。
答案 0 :(得分:6)
如果您想简单易懂,可以使用fmt.Sprintf
。
studentName := fmt.Sprintf("Hi, %s! Welcome.", name)
%s
部分将替换为name
的值。
答案 1 :(得分:4)
如果您的输入变得更大(更复杂)或者您需要多次替换不同的值,那么模板会更有效,更清晰,更灵活。查看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()
获得结果:
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))
t.Execute(os.Stdout, data) // Prints result to the standard output
// Now change something:
data["Name"] = "Alice"
data["ToBring"] = "a Teddy Bear"
t.Execute(os.Stdout, data)
}
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
并使用string
方法获取Buffer.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{}
t.Execute(&buf, data)
return buf.String()
}
const templ = `
Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`
答案 2 :(得分:2)
你可以考虑函数strings.Replace
return Replace(studentName, "? ", name, 1)
使用&#39; 1&#39;,它取代了第一个&#34;? &#34;它在studentName
中找到
替换返回studentName
的副本,"? "
替换为name
。
此严格尊重原始问题(具有该确切内容的全局变量)
现在,如果您开始更改问题,例如使用不同的内容(全局变量studentName := "Hi %s ,Welcome"
),然后,您可以使用fmt.Sprintf()
,如{{ 3}}&#39; s 425nesp
return fmt.Sprintf(studentName, name)
那将使用格式&#39;动词&#39; %s
,字符串的默认格式。
答案 3 :(得分:0)
假设全局字符串始终与您相同。
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
答案 4 :(得分:0)
您也可以使用 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"))
}