質問:
Qt バインディングに使用されるカスタム Go 構造体では、一部のフィールドには先頭にアンダースコア文字が付いていることが観察されます。この習慣は珍しいようです。構造体タグのコンテキストにおけるこれらのアンダースコアの目的は何ですか?
type CustomLabel struct { core.QObject _ func() `constructor:"init"` _ string `property:"text"` }
答え:
ここでの先頭のアンダースコアは、いわゆる「空白フィールド」を示します。または「匿名フィールド」。これらのフィールドはフィールド名として空白の識別子を使用するため、実質的にアドレス指定不可能になります。ただし、構造体のメモリ レイアウトには関与します。
これらの空白フィールドは、通常、パディングの目的で使用されます。後続のフィールドを外部システムからのデータのレイアウトに対応するバイトまたはメモリ位置に揃えることにより、空のフィールドにより構造体の値をシームレスかつ効率的にダンプまたは読み取りできるようになります。
特定の使用例:
この例では、アンダースコアは、Qt のコンストラクターとプロパティ設定メソッドの生成に特に使用されています。 bindings.
代替アプローチ:
匿名フィールドは型アノテーションの定義によく使用されますが、関連するオーバーヘッドのため、匿名フィールドは慎重に使用することが重要です。これらのフィールドは参照できないため、依然としてメモリを消費します。匿名フィールドを使用する場合は、この潜在的なパフォーマンスへの影響を考慮する必要があります。
代わりに、メモリ効率を維持するために、struct{} などのサイズが 0 の型の使用を検討してください。ただし、このアプローチでは、型情報にアクセスするためにリフレクションが必要になる可能性があるため、他のパフォーマンス上の欠点が生じる可能性があります。
代替方法では、gewünschte 型でサイズ 0 の配列を利用し、サイズ 0 のフットプリントと型アクセシビリティの両方を提供します。 .
type CustomLabel struct { _ [0]func() `constructor:"init"` _ [0]string `property:"text"` }
以上がQt バインディングの Go Struct タグでアンダースコアが使用されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。