如何忽略 fmt.Sprintf 的额外字段

我有一个 Golang 程序,它从命令行读取字符串参数并将其传递给 fmt.Sprintf 函数。假设 tmp_str 是命令行中的目标字符串。


package main


import "fmt"


func main() {

    tmp_str := "hello %s"

    str := fmt.Sprintf(tmp_str, "world")

    fmt.Println(str)

}

在某些情况下,程序会传递一个完整的字符串,比如“Hello Friends”,而不是字符串模板。程序会恐慌并返回:


你好朋友%!(额外的字符串=世界)


那么,如何忽略 fmt.Sprintf 的额外字段呢?


慕仙森
浏览 191回答 3
3回答

临摹微笑

是的,您可以通过切片传递给可变参数Sprintf函数的参数来做到这一点:func TruncatingSprintf(str string, args ...interface{}) (string, error) {    n := strings.Count(str, "%s")    if n > len(args) {        return "", errors.New("Unexpected string:" + str)    }    return fmt.Sprintf(str, args[:n]...), nil}func main() {    tmp_str := "hello %s %s %s"         // don't hesitate to add many %s here    str, err := TruncatingSprintf(tmp_str, "world") // or many arguments here    if err != nil {        fmt.Println(err)        return    }    fmt.Println(str)}但是您通常不使用动态格式化的字符串,这不安全,如果您想接受任何字符串,您还应该调整此代码以防止choke on %%s。如果您冒险走到这一步,那么您可能应该看看模板(它可以让您使用命名字符串,因此丢失的字符串不必是最后一个)。

浮云间

我同意Volker 的回答,但您可以检查您的输入字符串:package mainimport (    "fmt"    "strings")func main() {    tmp_str := "hello %s"    res := tmp_str    if strings.Count(tmp_str, "%s") == 1 {        res = fmt.Sprintf(tmp_str, "world")    }    fmt.Println(res)}

守着一只汪

在这种特殊情况下,您可以要求命令行用户始终提供 %s 动词,并说明他们可以将字符串截断为零长度:Hello Friends%.0s甚至更短:Hello Friends%.s输出很简单:你好朋友
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go