获取 Golang 标志作为字节数组

Get Golang flags as byte array

我正在使用 flag 包来读取我传递给 Golang 程序的所有参数。问题是,如果我传递一个参数,例如 "\x41BC",它不会被读取为 3 字节数组(带有字符 'A''B''C'),而是作为一个 6 字节数组('\''x''4''1''B''C')。

如果回答有用,我正在阅读该字符串:

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

有没有办法避免这种情况?

提前致谢!

"\x41BC" 是带引号的字符串。 flag package does not do any unquoting, it will just hand you over the arguments that were specified when starting your application. You can use the strconv.Unquote() and strconv.UnquoteChar() 函数取消对它们的引用。

您应该注意的一件事是 strconv.Unquote() 只能取消引号中的字符串(例如,以引号字符 " 或反引号字符 [=19= 开始和结束) ]), 所以我们必须手动附加它。

看这个例子:

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(&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