0

ディレクティブを使用するときにフラグ値にスペースを入れるにはどうすればよいですか?

環境

パッケージは、flagGo の呼び出し方法に応じて、スペースを含むフラグを異なる方法で受け取り、処理します。フラグの引用はコマンドラインからは機能しますが、たとえば などのディレクティブでは機能しませんgo generate

つまり、コマンド ラインから呼び出されるとFlag1、正しい値 (つまり、4 ワード、3 スペース) が返されます。

作品

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

動作しません

ただし、ディレクティブ ファイルでまったく同じコマンドを呼び出すと (たとえば、 を使用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は、シェルによって解析されます。go:generate ディレクティブは独自の解析を行い、その解析はシェルとは異なります。

関連する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 に答える