首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在golang中实现动态字符串

在golang中实现动态字符串
EN

Stack Overflow用户
提问于 2015-03-16 07:01:56
回答 5查看 7.2K关注 0票数 4

我有一个全局字符串,

代码语言:javascript
复制
studentName := "Hi ? ,Welcome"

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

代码语言:javascript
复制
func returnName(name string) string{
    return studentName+name
}

此函数应将字符串返回为

代码语言:javascript
复制
Hi name,welcome.

字符串应该从参数中取名称,并返回动态string.What是在golang中实现这一功能的最佳方法。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-03-16 08:05:47

如果您想保持简单,您可能只需使用fmt.Sprintf

代码语言:javascript
复制
studentName := fmt.Sprintf("Hi, %s! Welcome.", name)

%s部件将被name的值替换。

票数 12
EN

Stack Overflow用户

发布于 2015-03-16 07:22:53

如果您的输入变得更大(更复杂),或者需要多次替换不同的值,那么模板就会更有效、更干净和更灵活。查看text/template包。

template包只解析你的模板一次,从它构建一棵树,一旦你需要替换值,它就会动态地生成输出。

看一下这个例子:

代码语言:javascript
复制
const templ = `Hi {{.Name}}!
Welcome {{.Place}}.
Please bring {{.ToBring}}
`

您可以使用以下行解析这样的模板:

代码语言:javascript
复制
t := template.Must(template.New("").Parse(templ))

将其输入数据准备为structmap

代码语言:javascript
复制
data := map[string]string{
    "Name":    "Bob",
    "Place":   "Home",
    "ToBring": "some beers",
}

您可以使用Template.Execute()获得结果。

代码语言:javascript
复制
err := t.Execute(os.Stdout, data) // Prints result to the standard output

,以下是完整的、可运行的示例:(在围棋游乐场上尝试)

代码语言:javascript
复制
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}}
`

输出:

代码语言:javascript
复制
Hi Bob!
Welcome Home.
Please bring some beers

Hi Alice!
Welcome Home.
Please bring a Teddy Bear

作为一个string**:**获取结果的

如果要将结果作为string,可以将结果写入bytes.Buffer并使用Buffer.String()方法获取string

代码语言:javascript
复制
buf := bytes.Buffer{}
t.Execute(&buf, data)
var result string = buf.String()

完成程序(在围棋游乐场上尝试):

代码语言:javascript
复制
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}}
`
票数 7
EN

Stack Overflow用户

发布于 2015-03-16 07:07:07

您可以考虑函数strings.Replace

代码语言:javascript
复制
return Replace(studentName, "? ", name, 1)

用'1‘代替第一个"?“它在studentName中找到。

“替换”返回studentName的副本,"? "替换为name

这严格地尊重原始问题(包含确切内容的全局var )。

现在,如果您开始更改这个问题,比如使用一个不同的内容(一个全局变量studentName := "Hi %s ,Welcome"),那么您可以使用fmt.Sprintf(),就像425回答中一样。

代码语言:javascript
复制
return fmt.Sprintf(studentName, name)

它将使用格式‘谓词’%s (字符串的默认格式)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29071212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档