有什么方法可以做Sprintf结果的反演?

问题描述 投票:0回答:1

所以,我用

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

在另一个函数中,我可以访问变量 nameAndAge. 现在我想找回我在 Sprintf. 我能想到的一个忘我的方法就是根据分隔符进行分割,然后创建变量。我想知道是否有任何函数可以用来做这件事?

比如说

var name string
var age int
// " " is the separator here
fmt.ReverseSprintf(nameAndAge, " ", name, age)

谢谢你的帮助。

go
1个回答
4
投票

在某种程度上,它是可能的,有 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)

它的输出(在 去游乐场):

Batman 38
Batman 38

我写 "在某种程度上 "是因为你的例子很简单。如果你的 name 会包含空格,上面的例子就会被打破。

name := "Batman Robin"
// The rest is the same

输出将是:

Batman Robin 38
error expected integer
Batman 0

这是因为在我们的格式中 string 我们用空格来分隔输入,如果输入中本身就包含了空格,那么反转过程中就无法分辨出区别。另外扫描函数也会把输入中的换行当作空格,还有其他的区别。

© www.soinside.com 2019 - 2024. All rights reserved.