在Python中,您可以执行以下操作:
"File {file} had error {error}".format(file=myfile, error=err)
或者这个:
"File %(file)s had error %(error)s" % {"file": myfile, "error": err}
在Go中,最简单的选择是:
fmt.Sprintf("File %s had error %s", myfile, err)
这不允许您交换格式字符串中参数的顺序,您需要对I18N执行此操作。Go是否有template
包,它需要如下内容:
package main
import (
"bytes"
"text/template"
"os"
)
func main() {
type Params struct {
File string
Error string
}
var msg bytes.Buffer
params := &Params{
File: "abc",
Error: "def",
}
tmpl, _ := template.New("errmsg").Parse("File {{.File}} has error {{.Error}}")
tmpl.Execute(&msg, params)
msg.WriteTo(os.Stdout)
}
对于一条错误消息来说,这似乎是一段很长的路要走。是否有一个更合理的选项允许我提供与顺序无关的字符串参数?
我不知道任何命名参数的简单方法,但是可以使用显式参数索引轻松更改参数的顺序:
来自docs:
那你就可以了
用
strings.Replacer
使用^{} ,实现愿望的格式化程序非常简单和紧凑。
输出(在Go Playground上尝试):
我们可以通过在
log()
函数中自动将括号添加到参数名中,使其更易于使用:输出(在Go Playground上尝试):
是的,您可以说它只接受
string
参数值。这是真的。如果再提高一点,就不会是这样了:输出(在Go Playground上尝试):
接受参数作为
map[string]interface{}
并返回结果作为string
的一种变体:在Go Playground上试试。
与
text/template
你的模板解决方案或建议也太冗长了。它可以这样写(省略错误检查):
输出(在Go Playground上尝试):
如果要返回
string
(而不是打印到标准输出),可以这样做(在Go Playground上尝试):使用显式参数索引
这已经在另一个答案中提到了,但是要完成它,要知道同一个显式参数索引可以被任意次数使用,从而导致同一个参数被多次替换。在这个问题中阅读更多关于这个的信息:Replace all variables in Sprintf with same variable
参数也可以是一个映射,因此如果您不介意每次使用时都解析每个错误格式,则以下函数将起作用:
它仍然比我想要的要多一些,但是我想它比其他的选择要好。您可以将
map[string]interface{}
转换为本地类型,并进一步将其减少为:相关问题 更多 >
编程相关推荐