我正在使用flag
包来读取我传递给Golang程序的所有参数。问题在于,如果我传递"\x41BC"
之类的参数,则不会将其读取为3字节数组(使用字符'A'
,'B'
和'C'
),但是一个6字节的数组('\'
,'x'
,'4'
,'1'
,'B'
,'C'
)。
如果回答可能有用,我正在使用:
读取该字符串flag.StringVar(¶m, "param", "", "the param with hex chars")
有没有办法避免这种情况?
提前致谢!
答案 0 :(得分:5)
"\x41BC"
是带引号的字符串。 flag
包不会进行任何取消引用,它只会将您交给启动应用程序时指定的参数。您可以使用strconv.Unquote()
和strconv.UnquoteChar()
功能取消引用它们。
您应该注意的一点是strconv.Unquote()
只能取消引号中的字符串(例如,引号char "
或后引号char `
的开头和结尾) ,所以我们必须手动追加。
见这个例子:
s := `\x41BC`
fmt.Println(s)
s2, err := strconv.Unquote(`"` + s + `"`)
if err != nil {
panic(err)
}
fmt.Println(s2)
输出(在Go Playground上尝试):
\x41BC
ABC
因此,如果您希望能够提供带引号的字符串作为命令行参数并且仍然具有不带引号的值,则必须在调用flag.Parse()
后使用strconv.Unquote()
取消引用它们,例如:
var param string
flag.StringVar(¶m, "param", "", "the param with hex chars")
flag.Parse()
var err error
param, err = strconv.Unquote(`"` + param + `"`)
if err != nil {
panic(err) // handle error
}
// param now contains the unquoted argument value