Go では、キーと値のペアを格納するためにマップが使用されます。マップの値の型は、インターフェイスや構造体を含む任意の型にすることができます。空のインターフェイスと空の構造体はどちらもマップ内に値が存在しないことを表すために使用できますが、この 2 つにはいくつかの重要な違いがあります。
メモリ使用量
空の構造体のサイズは、アーキテクチャに関係なく、0 バイトに固定されています。一方、空のインターフェイスのサイズは、32 ビット アーキテクチャでは 8 バイト、64 ビット アーキテクチャでは 16 バイトです。これは、値が nil であっても、空のインターフェイスは実際の値へのポインタを格納するためです。
質問で提供されているコード例は、この違いを示しています。
package main import ( "fmt" "unsafe" ) func main() { var s struct{} fmt.Println(unsafe.Sizeof(s)) var i interface{} fmt.Println(unsafe.Sizeof(i)) var b bool fmt.Println(unsafe.Sizeof(b)) }
出力(32 ビット アーキテクチャの場合はバイト):
0 8 1
出力(64 ビット アーキテクチャのバイト):
0 16 1
ご覧のとおり、空の構造体のメモリ オーバーヘッドは 0 バイトですが、空のインターフェイスのオーバーヘッドは 8 バイト (32-ビット)または16バイト(64 ビット)。
パフォーマンス
一般に、パフォーマンスの点では、空のインターフェイスを使用するよりも空の構造体を使用する方が効率的です。これは、コンパイラが空の構造体を含む操作をより効果的に最適化できるためです。
結論
マップの値の型に応じて空のインターフェイスと空の構造体のどちらを選択するかは異なります。アプリケーションの特定の要件について。メモリ使用量が懸念される場合は、空の構造体を選択することをお勧めします。パフォーマンス上の理由から、空の構造体も推奨されます。ただし、マップがさまざまな値タイプで使用されることを目的としている場合は、空のインターフェイスの方が適切な場合があります。
以上が空の構造体と空のインターフェイス: Go ではどちらがより良いマップ値ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。