使用指令时如何在标志值中获得空格?
<上下文/h3>
flag
包接收和/或处理带有空格的标志取决于如何调用Go。引用标志值可以在命令行中使用,但不能在指令中使用,例如go generate
。
换句话说,从命令行调用,Flag1
将收到正确的值(即4个单词,3个空格)。
% go run -tags generate main.go -Flag1="flag value with spaces"
<不工作/h3>
然而,在指令文件中调用完全相同的命令,例如,使用go generate ./...
,Flag1
将不会收到正确的值。取一个指令文件(例如,generate.go
),其中有这一行:
//go:generate go run -tags generate main.go -Flag1="flag value with spaces" -Flag2=next
Flag1
没有正确设置,Flag2
没有设置。
go run
的参数由shell解析。go:generate指令进行自己的解析,这种解析与shell不同。
相关go:generate文档为:
指令的参数是在运行时作为单独参数传递给生成器的空格分隔令牌或双引号字符串。
带引号的字符串使用Go语法,在执行前求值;带引号的字符串作为生成器的单个参数出现。
每个参数用空格分隔。参数要么是一个"记号";或者双引号字符串。文档没有描述标记,但我们可以假设它表示非空格字符序列。
带引号的字符串求值。这意味着引号被删除,转义序列未被转义,等等。该实现使用strconf . unquote对字符串求值。
基于以上,使用:
//go:generate go run -tags generate main.go "-Flag1=flag value with spaces"
这里重要的变化是"
向前移动到一个位置,在那里它被一个空格继续。令牌内的引号将被忽略。
从一个旧的,相关的,但不相同的问题推断,将整个标志键,破折号和值括在引号中。
//go:generate go run -tags generate main.go "-Flag1=flag value with spaces"
这种语法的优点是在命令行或指令文件中工作。
目前的文档(我能找到的)都没有提供一个明确的答案:
flag
文档没有提到带空格的标志值。- 指令文档提供了这个神秘的提示,引导您找到正确的解决方案(尽管更清晰一点会有所帮助)。
带引号的字符串使用Go语法,在执行前求值;带引号的字符串作为生成器的单个参数出现。