我正在使用flag包来读取传递给Golang程序的所有参数。问题是,如果我传递诸如"\x41BC"之类的参数,则不会以3字节数组(带有chars 'A''B''C')的形式读取,而是以6字节数组('\''x''4''1''B''C'读取)。

如果回答可能有用,我正在使用以下方法读取该字符串:

flag.StringVar(&param, "param", "", "the param with hex chars")

有办法避免这种情况吗?

提前致谢!

最佳答案

"\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

因此,如果您希望能够提供带引号的字符串作为命令行参数并且仍然具有未加引号的值,则必须在调用 strconv.Unquote() 之后用flag.Parse()取消引号,例如:
var param string
flag.StringVar(&param, "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

关于arrays - 获取Golang标志作为字节数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36267968/

10-10 00:56