関連記事
GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ
概要
以下、自分用のメモです。忘れないうちにメモメモ。。。
以下の記事を見つけました。
Go 1.24以降は新しいmapの実装方法として Swiss Table が採用されていますが
この採用以降、内部のmap実装が変化したため、以前では安いと考えれていた
map[key]struct{}
が実質的に
map[key]bool
と変わらないメモリ使用量になっているという内容です。構造体のアライメントのためのパディングが関係しています。
If the last field of a struct is zero, Go compiler makes its size 1 byte so that the field can be actually referred in memory by pointer arithmetic without violating memory access (out of bounds reads).
最後のフィールドがゼロサイズの場合、Go コンパイラはそのフィールドをポインタ演算で参照できるように、 1 バイトのサイズを設定するとのことなので
type struct { key int, elem struct{} } も type struct { key int, elem bool } も結局 (8 + (1+7)) で同じ16バイトになるということですね。
GoにはSetが無いので、良く map[key]struct{} で表現することが多いと思います。
Go 1.24 以降の場合は、map[key]boolでもメモリ使用量同じなので、map[key]boolの方が分かりやすくて良いかもしれませんね。
(因みに私は map[key]bool を使う派です)
Apparently, the map[T]struct{} trick for implementing sets doesn't save memory in Go 1.24+
— Anton Zhiyanov (@ohmypy) 2025年12月15日
You can just use map[T]bool 🤔 https://t.co/CaqT73NlS0
恐らく、そのうち修正されて、以前と同じように map[key]struct{} の方が安い形に戻ると思いますが、今はこうなっているという認識はメモメモ。。。
参考情報
個人的Goのおすすめ書籍
個人的に読んでとても勉強になった書籍さんたちです。
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。






