Switch と ForEach を使用した Golang テンプレート
背景:
タスクは、 switch と ForEach の両方の構造を組み込んだ Go プログラムの bash.sh ファイル。生成されたスクリプトは、依存関係のリストを反復処理し、その型にアクセスし、その型を使用して特定のメッセージを出力する必要があります。
問題:
YAML マーシャリングとテンプレートの解析により、正しく機能しませんでした。この問題は、依存関係の種類がテンプレートで正しく使用されていないために発生しました。
解決策:
問題を解決するには、依存関係の構造が Install フィールドは、タイプごとに実行されるコマンドを表します。次に、Dependency 配列を反復処理し、range および switch コンストラクトを使用してタイプに基づいてコマンドを出力するテンプレートが作成されました。次のコード スニペットは、改訂されたアプローチを示しています:
出力:<code class="go">import ( "log" "text/template" "gopkg.in/yaml.v2" "os" ) type File struct { TypeVersion string `yaml:"_type-version"` Dependency []Dependency } type Dependency struct { Name string Type string CWD string Install map[string]string } var data = ` _type-version: "1.0.0" dependency: - name: ui type: runner cwd: /ui install: api: echo api1 - name: ui2 type: runner2 cwd: /ui2 install: api: echo api2 ` func main() { f := File{} err := yaml.Unmarshal([]byte(data), &f) if err != nil { log.Fatalf("error: %v", err) } const t = ` #!/bin/bash {{range .Dependency}} echo "type is {{.Type}}" echo "cwd is {{.CWD}}" {{range $installName, $installCmd := .Install}} echo "install {{$installName}} ({{$installCmd}})" {{end}} {{end}} ` tt := template.Must(template.New("").Parse(t)) err = tt.Execute(os.Stdout, f) if err != nil { log.Println("executing template:", err) } }</code>
更新されたコードにより、期待されるスクリプトが生成されます:
要約解決策には、テンプレートを正しく使用して依存関係データにアクセスし、
switch<code class="sh">#!/bin/bash echo "type is runner" echo "cwd is /ui" echo "install api (echo api1)" echo "type is runner2" echo "cwd is /ui2" echo "install api (echo api2)"</code>と
ForEach を使用してタイプに基づいて適切なコマンドを生成することが含まれます。
以上がSwitch および ForEach で Go テンプレートを使用して、依存関係タイプ固有のコマンドを含む Bash スクリプトを生成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。