登录
首页 >  Golang >  Go问答

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

来源:Golang技术栈

时间:2023-04-12 15:54:10 145浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《如何忽略 fmt.Sprintf 的额外字段》将会介绍到golang等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我有一个 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 的额外字段呢?

正确答案

是的,您可以通过切片传递给可变参数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 多于参数,也会输出不同的版本)

但是您通常不使用动态格式的字符串,这不安全,如果您想接受 任何 字符串,您还应该将此代码调整为 no choke on %%s。如果您冒险到这里,那么您可能应该看看模板(它可以让您使用命名字符串,因此丢失的字符串不必是最后一个)。

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>