在golang中实现动态字符串

时间:2015-03-16 07:01:56

标签: string go

我有以下全局字符串,

studentName := "Hi ? ,Welcome"

现在我想动态地取这个字符串

func returnName(name string) string{
    return studentName+name
}

此函数应将字符串返回为

Hi name,welcome.

string应该从参数中取名,并返回动态字符串。在golang中实现它的最佳方法是什么。

5 个答案:

答案 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))

structmap

的形式准备输入数据
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"))
}