gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:36:52 28 4
gpt4 key购买 nike

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

Hello Friends%!(EXTRA string=world)

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

最佳答案

是的,您可以通过将传递给可变参数 Sprintf 函数的参数 slice 来做到这一点:

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)
}

Demonstration 1

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

但是您通常不使用动态格式化字符串,这是不安全的,如果您想接受任何 字符串,您还应该调整此代码以在 %% 上不阻塞s。如果你冒险走到这一步,那么你应该看看 templates (这将允许您使用命名字符串,因此丢失的字符串不一定是最后一个)。

关于go - 如何忽略 fmt.Sprintf 的额外字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35043202/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com