当前位置: 首页 > 面试题库 >

如何忽略fmt.Sprintf的其他字段

西门嘉澍
2023-03-14
问题内容

我有一个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”,而不是字符串模板。.程序会惊慌并返回:

你好朋友%!(EXTRA string = world)

因此,如何忽略fmt.Sprintf的额外字段?


问题答案:

是的,您可以通过切片传递给可变参数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)
}

示范1

演示2 (即使%s大于参数,也会输出不同的版本)

但是您通常不使用动态格式的字符串,这是不安全的,并且如果您想接受 任何
字符串,则还应该使此代码适应于您的需求%%s。如果您走了这么远,那么您可能应该看看模板(它可以让您使用命名字符串,因此丢失的一个不必是最后一个)。



 类似资料:
  • 问题内容: 鉴于以下课程, 假设在调用ClassOne.main之后还有其他事情要做,则下面的类也将被破坏。 有没有办法忽略System.exit(1); ClassTwo的调用中对ClassOne的了解? 问题答案: 您 本身 不能忽略它,但是可以防止它通过SecurityManager终止JVM。查看此问题以获取详细的代码示例。

  • 我在应用程序中设置了以下Maven多模块。属性以及模块A中相应的属性类和配置: 应用程序。特性: 以及 然后是模块C和我的应用程序: 相关: 还有豆子测试。属性文件: 从中删除最后一个bean时,应用程序将启动。但是,有了这个bean定义,我得到了以下错误: 描述:无法注册在类路径资源[c/CConfiguration.class]中定义的bean“cityProperties”。已在文件[/mo

  • 我有一个DB中的人员列表,每个人都有一个CV字段,这是一个Spring中的多部分文件。我试图从数据库中获取所有的人,但忽略CV字段,因为我不想在使用getAllPerson函数时被下载。有可能?

  • 我使用的是IntelliJ IDEA 2017.3。我有一个名为“test”的项目,它在src文件夹下有两个类: ,有打印出“Hello World”的main方法 ,有一个具有编译错误的方法 这两个类没有依赖关系。我试图在main类中运行main(),并将before launch设置为“build,no error check”

  • 我试图创建一个随机数生成器程序,跟踪玩家的胜利,损失,获胜百分比和总奖金。该程序的逻辑是,玩家每节获得3次机会,计算机生成一个随机数,玩家需要猜测或者更确切地说应该匹配。 我试过用如果 如果您对此有任何意见,我们将不胜感激。 游戏类别:

  • 我是新手,当我使用morphia java mongodb时,我有一个问题。我有“新闻”数据库在mongodb中的收藏是“文章”的一个例子: 在不丢失数据的情况下更新集合的最快方法是什么?如何在将这个文章类映射到MongoDB时忽略额外的字段? 谢谢