0

使用指令时如何在标志值中获取空格?

语境

包接收和/或处理带有空格的flag标志,具体取决于调用 Go 的方式。引用标志可以从命令行使用,但不能使用指令,例如go generate, 例如。

换句话说,从命令行调用,Flag1将收到正确的值(即,4 个字,3 个空格)。

作品

% go run -tags generate main.go -Flag1="flag value with spaces"

不工作

但是,在指令文件中调用完全相同的命令,例如 with go generate ./...Flag1将不会收到正确的值。获取一个包含以下行的指令文件(例如,generate.go):

//go:generate go run -tags generate main.go -Flag1="flag value with spaces" -Flag2=next

Flag1设置不正确,Flag2根本没有设置。

4

2 回答 2

1

的参数go run由您的 shell 解析。go:generate 指令进行自己的解析,该解析与 shell 不同。

相关的go:generate 文档是:

该指令的参数是空格分隔的标记或双引号字符串,在运行时作为单独的参数传递给生成器。

带引号的字符串使用 Go 语法并在执行前进行评估;带引号的字符串显示为生成器的单个参数。

每个参数由空格分隔。参数要么是“令牌”,要么是双引号字符串。该文档没有描述令牌,但我们可以假设它表示一系列非空格字符。

引用的字符串被评估。这意味着引号被删除,转义序列未被转义等。该实现使用strconv.Unquote评估字符串。

基于以上,使用:

//go:generate go run -tags generate main.go "-Flag1=flag value with spaces"

这里的重要变化是"向前移动到一个由空格进行的位置。标记内的引号将被忽略。

于 2021-09-13T20:25:02.037 回答
0

从一个旧的、相关但不相同的问题推断,将整个标志键、破折号和值括在引号中。

//go:generate go run -tags generate main.go "-Flag1=flag value with spaces"

此语法具有在命令行或指令文件中工作的优点。

当前的文档(我能找到)都没有提供明确的答案:

  • flag文档没有提到带有空格的标志值。
  • 指令文档提供了这个神秘的提示,可以引导您找到正确的解决方案(尽管更加清晰会有所帮助)。

带引号的字符串使用 Go 语法并在执行前进行评估;带引号的字符串显示为生成器的单个参数。

于 2021-09-13T20:05:42.700 回答