<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Swiss Table on Zampo Blog</title><link>https://blog.cpdd.fyi/tags/swiss-table/</link><description>Recent content in Swiss Table on Zampo Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 23 May 2026 14:45:00 +0800</lastBuildDate><atom:link href="https://blog.cpdd.fyi/tags/swiss-table/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 1.25 的 map 已经换了一套发动机：Swiss Table 到底改了什么</title><link>https://blog.cpdd.fyi/posts/go-swiss-map-design/</link><pubDate>Sat, 23 May 2026 14:45:00 +0800</pubDate><guid>https://blog.cpdd.fyi/posts/go-swiss-map-design/</guid><description>&lt;p&gt;你读过的很多 Go map 文章，可能已经过时了。&lt;/p&gt;
&lt;p&gt;它们还在讲 &lt;code&gt;hmap&lt;/code&gt;、&lt;code&gt;bmap&lt;/code&gt;、overflow bucket、load factor 6.5，还会画一张 bucket 后面挂着 overflow bucket 的图。那些内容不是没有价值。问题在于，从 Go 1.24 开始，默认 map 实现已经换成 Swiss Table；到了 Go 1.25，再把旧模型当成主线讲，就会把读者带偏。&lt;/p&gt;
&lt;p&gt;map 的 API 没变。&lt;code&gt;make(map[K]V)&lt;/code&gt; 还是那个写法，&lt;code&gt;m[k]&lt;/code&gt; 还是查找，&lt;code&gt;delete(m, k)&lt;/code&gt; 还是删除，&lt;code&gt;range m&lt;/code&gt; 还是遍历。&lt;/p&gt;
&lt;p&gt;但发动机已经换了。&lt;/p&gt;
&lt;p&gt;旧模型里，map 更像一排 bucket，每个 bucket 装几个 key/value，冲突多了就挂 overflow bucket。新模型里，Go map 的核心变成了 Swiss Table：开放寻址、group、control word、H1/H2、多 table、extendible hashing。&lt;/p&gt;
&lt;p&gt;这不是“源码爱好者才需要知道”的细节。你排查性能、解释内存占用、写技术分享，甚至只是判断某篇文章能不能信，都得先问一句：它讲的是 Go 1.24 以前的默认实现，还是现在的 Swiss map？&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.cpdd.fyi/images/go-swiss-map-design/cover.png" alt="Go map 发动机更换"&gt;&lt;/p&gt;
&lt;h2 id="旧-hmap-没消失但它已经不是默认主线"&gt;旧 hmap 没消失，但它已经不是默认主线&lt;/h2&gt;
&lt;p&gt;先把边界说清楚：旧的 &lt;code&gt;hmap + bmap + overflow bucket&lt;/code&gt; 不是错。&lt;/p&gt;
&lt;p&gt;它曾经是 Go map 的默认实现。今天在 Go 1.25.4 的源码里，旧实现也还在，文件名很直接：&lt;code&gt;runtime/map_noswiss.go&lt;/code&gt;。问题是，它不再是默认路径。Go 1.24 的发布说明已经把 built-in map 的新 Swiss Table 实现作为默认行为；本机 Go 1.25.4 源码里，新的入口是 &lt;code&gt;runtime/map_swiss.go&lt;/code&gt;，真正的核心实现则在 &lt;code&gt;internal/runtime/maps&lt;/code&gt; 下面。&lt;/p&gt;</description></item></channel></rss>