有没有办法做 Sprintf 结果的逆运算

Obi*_*Jha 2 string printf go

所以,我创建了一个字符串变量使用

name := "Batman"
age := 38
nameAndAge = fmt.Sprintf("%s %d", name, age)
Run Code Online (Sandbox Code Playgroud)

在另一个函数中,我可以访问变量nameAndAge。现在我想取回我在Sprintf. 我能想到的一种不经意的方法是根据分隔符拆分它并创建变量。我想知道是否有任何功能可以做到这一点?

喜欢,

var name string
var age int
// " " is the separator here
fmt.ReverseSprintf(nameAndAge, " ", name, age)
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

icz*_*cza 6

在某种程度上它是可能的,这是fmt.Sscanf()为了这个。引用包文档fmt:扫描

Scanf、Fscanf 和 Sscanf 根据格式字符串解析参数,类似于 Printf 的格式字符串。

看这个例子:

name := "Batman"
age := 38
output := fmt.Sprintf("%s %d", name, age)

fmt.Println(output)

var name2 string
var age2 int
if _, err := fmt.Sscanf(output, "%s %d", &name2, &age2); err != nil {
    fmt.Println("error", err)
}
fmt.Println(name2, age2)
Run Code Online (Sandbox Code Playgroud)

它输出(在Go Playground上尝试):

Batman 38
Batman 38
Run Code Online (Sandbox Code Playgroud)

我写“在某种程度上”是因为你的例子很简单。如果您name将包含空格,则上面的示例将中断:

name := "Batman Robin"
// The rest is the same
Run Code Online (Sandbox Code Playgroud)

输出将是:

Batman Robin 38
error expected integer
Batman 0
Run Code Online (Sandbox Code Playgroud)

这样做的原因是因为在我们的格式中string我们使用空格来分隔输入,如果空格本身包含在输入中,则逆向过程无法区分。此外,扫描功能将输入中的换行符视为空格,以及其他差异。