最近在继续完善自己的 A Tour of Go 多语言站点时,我遇到了一个看起来有些反直觉的问题:
Google AdSense 自动广告已经启用,广告脚本也正常加载,但课程页面中的展示广告始终没有出现。
更奇怪的是,从人的视角来看,页面明明存在很大一块空白区域。
乍一看,这里似乎非常适合放一个展示广告。
但实际情况是:无论等待多久、刷新多少次,这些空白区域里都没有出现普通的页面展示广告。
这也成为后续一系列 A Tour of Go 广告、SPA、SEO 和 Prerender 调整的起点。
页面明明有这么大的空白
最初让我觉得奇怪的,就是课程页面本身。
A Tour of Go 使用左右分栏布局:
左侧是课程说明,右侧是代码编辑器和运行结果。
有些课程内容比较短,于是在左侧正文结束以后,会留下非常明显的大块空白。

从截图里看,红框区域相当大。
如果仅仅按照人的视觉判断,这里放一个矩形广告似乎完全没有问题。
所以我一开始也很自然地想到:
是不是 AdSense 自动广告根本没有启用?
或者广告代码没有正确加载?
先确认 Auto Ads 本身已经启用
首先检查 Google AdSense 后台。
站点的自动广告确实处于启用状态。

这意味着问题不能简单解释为:
“忘记打开 Auto Ads。”
至少从 AdSense 配置来看,Google 已经被允许自动寻找适合的广告位置。
不过,仅仅后台显示“启用”,还不能证明浏览器端的广告代码真的正常工作。
于是继续检查页面实际加载的网络资源。
adsbygoogle.js 也确实加载成功
打开浏览器开发者工具,在 Network 中搜索 adsbygoogle。
可以看到:
pagead2.googlesyndication.com
adsbygoogle.js
HTTP 200
至此,可以排除两个最直观的问题:
- Auto Ads 并没有关闭;
- AdSense 主脚本也不是因为网络或页面配置完全没有加载。
但页面里依然没有普通展示广告。
这时候问题就开始变得有意思了。
“看起来有空白”不等于“DOM 中存在广告位置”
一开始我其实潜意识里做了一个假设:
浏览器页面上有一大片白色区域,就意味着 Google 可以在那里插入一个广告。
后来发现,这个假设并不成立。
浏览器最终显示出来的是一个二维画面。
而 Google 判断广告能否插入时,面对的并不只是这张“截图”,而是实际的 HTML、DOM 结构和 CSS 布局。
换句话说:
人看到的是空白像素,广告系统看到的却是元素、容器、定位关系以及文档流。
两者不是一回事。
这一点在 A Tour of Go 上尤其明显。
A Tour of Go 本身不是普通文章页面
为了进一步确认这一点,我直接查看了官方 A Tour of Go:
https://go.dev/tour/welcome/3这里使用官方页面作为结构参考,是因为自己的多语言版本一直尽量沿用上游 A Tour of Go 的课程架构,而不是重新实现一套完全不同的页面。
打开开发者工具以后,可以看到课程主体大致存在这样的层级:
ng-view
└── #editor-container
├── .relative-content
│ └── #left-side
│ └── .relative-content
│ └── .slide-content
└── #right-side
图中选中了左侧的 .slide-content。
浏览器同时用蓝色区域标出了这个元素实际占据的布局区域。
这个截图让我更容易理解之前那个现象:
页面上看起来还有很多白色区域,并不代表这些区域在 DOM 中就是一段普通、连续、适合插入广告的文档流。
A Tour of Go 本质上是一个交互式课程应用,而不是传统博客文章。
它有自己的:
- 左右分栏;
- 编辑器区域;
- 相对定位关系;
- 页面高度计算;
- SPA 页面切换;
- 固定的课程交互结构。
在这种布局中,“某个位置现在没有文字”与“这里存在一个 Google 可以安全插入展示广告的容器”,完全是两个概念。
为什么视觉空白可能无法成为广告位
传统文章页面通常比较简单:
正文
正文
正文
广告
正文
正文所有内容都顺着正常文档流从上向下排列。
如果 Google 在两个块级内容之间插入一个广告,页面通常只需要自然向下延伸即可。
但 A Tour of Go 的课程页并不是这样的结构。
它更接近:
┌─────────────────┬─────────────────┐
│ │ │
│ 课程内容 │ 代码编辑器 │
│ │ │
│ │ │
│ 视觉空白 │ 运行结果 │
│ │ │
│ │ │
└─────────────────┴─────────────────┘这里左侧正文结束以后产生的“空白”,实际上仍然属于整个左右分栏布局的一部分。
它不是简单的:
<p>正文结束</p>
这里什么都没有
<footer>所以即使人在截图里觉得:
这里至少还能放一个 300×250 的广告。
Google 的自动布局逻辑也未必会得出相同结论。
广告系统还必须考虑这个位置插入新元素以后:
- 是否会破坏已有布局;
- 容器有没有稳定尺寸;
- 广告是否处于正常可见区域;
- 页面重新布局以后是否仍然合理;
- 与其他页面元素之间是否存在冲突;
- 当前结构是否适合自动创建一个广告节点。
这也是为什么单纯依靠“页面还有空白”来判断 Auto Ads 是否应该展示,并不可靠。
到这里,问题范围已经明显缩小
经过这一轮检查以后,至少可以确认:
Auto Ads 已启用
↓
adsbygoogle.js 加载成功
↓
页面存在大量视觉空白
↓
普通展示广告依然没有出现因此,问题已经不能继续简单归结为 AdSense 没有工作。
更合理的方向变成了:
A Tour of Go 原有的 DOM 和页面布局,并没有为 Google Auto Ads 提供它能够正常使用的页面内展示广告位置。
需要说明的是,这并不是说我能够从浏览器端精确知道 Google 内部为什么拒绝某一个具体位置。
Google 的自动广告决策本身属于黑盒。
所以更准确的表述应该是:
从实际现象和页面结构来看,Auto Ads 没有把人眼看到的这些空白区域识别为适合自动插入普通展示广告的位置。
截至后来继续排查时,我也一直没有在这些课程页面上真正看到 Auto Ads 自动插入普通的页面展示广告。
因此,继续单纯等待 Google“总有一天自己找到位置”,已经不是一个很可靠的方案。
这又引出了一个更大的问题
如果原来的 A Tour of Go 页面结构不适合自动广告,那么最直接的解决方法似乎是:
修改页面结构。
甚至可以进一步考虑:
干脆放弃现有 SPA,让每一节课程都变成传统的独立页面。
这样一来:
- 页面结构更接近普通文章;
- 每次点击下一页都会重新加载页面;
- AdSense 可以重新执行;
- SEO 也会变得更加直接。
从广告角度看,这条路线其实很诱人。
但 A Tour of Go 并不是一个为了广告而存在的网站。
自己的版本长期还需要跟踪和同步上游 golang/website。
如果为了 AdSense 大幅改变上游的页面架构,今天解决的是广告问题,未来增加的可能却是长期维护成本。
所以问题从这里开始发生了变化。
最初的问题只是:
为什么明明有这么大的空白,却没有广告?
排查到最后,真正需要决定的却变成了:
为了 AdSense,到底值不值得放弃 A Tour of Go 原来的 SPA 架构?
这也成为下一阶段需要做出的架构选择。
A Tour of Go 多语言翻译项目
本系列完整记录 A Tour of Go 多语言翻译项目从架构设计、整页翻译、结构保护、自动校验,到生产发布与后续维护的实际开发过程。
项目入口:
✅ 在线学习:A Tour of Go 简体中文版
✅ 项目源码:GitHub:shuijingwan/go-tour-i18n
当前第一阶段已完成简体中文版本。项目属于非官方社区多语言翻译项目,与 Go 官方无隶属或授权关系。

