网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)
更多服务器知识,尽在hostol.com
嘿,各位站长和网站管理员朋友们!咱们精心打造的网站,内容再好,设计再炫,如果用户打开它的时候,加载速度慢得像“老牛拉破车”,那体验可就大打折扣了,说不定用户等不及就直接“拜拜”了。除了拥有给力的服务器硬件和优化的代码,还有一个能让你网站速度“原地起飞”的“魔法秘籍”——那就是缓存(Caching)!是不是听起来有点玄乎?别急,今天Hostol就来当一回“魔法导师”,带你揭开“浏览器缓存”和“服务器端页面缓存”这两大“加速咒语”的神秘面纱,并手把手教你怎么在Nginx和Apache上施展它们,让你的网站也能拥有风驰电掣般的速度!
缓存是个啥?—— 省时省力的“记忆大师”
在聊具体的“魔法咒语”之前,咱们先得明白,“缓存”这位“记忆大师”到底是何方神圣。简单来说,缓存就是把一些经常被访问的、或者生成起来比较费劲的数据,预先存放在一个更容易获取的地方(比如用户的浏览器里,或者服务器的内存/硬盘上),当下次再需要这些数据时,就可以直接从这个“快捷通道”取用,而不用每次都辛辛苦苦地重新去“源头”(比如服务器深处、数据库)获取或生成一遍。
想象一下,你去图书馆借一本超级热门的书:
- 没有缓存: 图书管理员每次都得从最里面的书库(源服务器/数据库)把书给你找出来,效率低下。
- 有了缓存: 图书管理员发现这本书太火了,就直接在咨询台(缓存区)放了几本复印件或者原书。你一来,直接从咨询台拿走,是不是快多了?
网站缓存的原理也是如此,目的就是为了:减少等待时间,降低服务器压力,提升用户体验! 咱们主要聊两种最常用也最有效的缓存魔法:浏览器缓存和服务器端页面缓存。
第一重魔法:浏览器缓存 —— 给访客的“极速重逢”体验
浏览器缓存,顾名思义,就是让访问你网站的用户,他们的浏览器把一些不常变化的“静态资源”(比如你网站的Logo图片、CSS样式表、JavaScript脚本文件等)在第一次访问时就“下载并保存”到用户自己的电脑上。
这样,当这位用户再次访问你的网站,或者访问你网站的其他页面时,如果又需要用到这些已经“存好”的资源,浏览器就可以“就地取材”,直接从本地硬盘加载,而不用眼巴巴地再从你的服务器上重新下载一遍。这感觉,就像是老朋友重逢,不用过多寒暄,默契十足,自然神速!
施法道具:HTTP响应头里的“缓存咒语”
浏览器听不听话,肯不肯缓存你的资源,以及缓存多久,主要就靠你(的服务器)在HTTP响应头里下达的“缓存指令”了。常用的“咒语”有:
Expires
(过期时间): 这是个比较老的“咒语”,它直接告诉浏览器这个资源在某个具体的“绝对时间点”(比如:Expires: Wed, 28 May 2025 12:00:00 GMT
)之前都有效,可以大胆用缓存。但它的问题在于,服务器和客户端的时间可能不同步,导致判断失误。Cache-Control
(缓存控制): 这是更现代、更强大也更灵活的“主控咒语”,优先级也比Expires
高。它有很多“法术变种”:max-age=<秒数>
:告诉浏览器这个资源从现在开始,在多少秒内都是新鲜的,可以直接用缓存。比如Cache-Control: max-age=31536000
(缓存一年)。这是最常用的!public
:表明响应可以被任何缓存(包括用户的浏览器、CDN节点、代理服务器等)缓存。private
:表明响应只能被用户的浏览器缓存,中间的代理服务器不能存。no-cache
:并不是“不缓存”的意思!而是说浏览器可以用本地缓存,但在用之前,必须先去服务器那里“打个招呼”(发送一个验证请求,比如带上If-None-Match
或If-Modified-Since
头部),问问服务器这个缓存还能不能用。如果服务器说“能用”(返回304 Not Modified状态码),浏览器才用缓存;否则就得下载新的。no-store
:这才是真正的“雁过拔毛,不留痕迹”——完全禁止浏览器和任何中间缓存存储这个响应的任何部分。通常用于涉及敏感信息的页面。
ETag
(实体标签) 与Last-Modified
(最后修改时间): 这两位是Cache-Control: no-cache
的“好搭档”,用来做缓存验证。Last-Modified
:服务器告诉浏览器这个资源上次是啥时候改的。浏览器下次请求时会带上If-Modified-Since
头部问:“这玩意儿从我上次看的时间点之后,你改过没?”ETag
:服务器给资源生成的唯一“指纹”。浏览器下次请求时会带上If-None-Match
头部问:“这资源的‘指纹’还是不是这个?”
304 Not Modified
响应,告诉浏览器“放心用你本地的缓存吧!”,连文件本体都不用传了,是不是超省流量?
“咒语”怎么念?—— Nginx与Apache配置实例
通常,我们对不常变化的静态资源(图片、CSS、JS)设置较长的缓存时间。
Nginx配置示例 (在server
块或特定location
块中添加):
location ~* \.(?:jpg|jpeg|gif|png|ico|css|js|svg|woff|woff2)$ {expires 30d; # 缓存30天 (这会自动添加Cache-Control: max-age和Expires头部)add_header Cache-Control "public, no-transform"; # 明确指定为public,并禁止代理服务器修改内容access_log off; # 可选:关闭这些静态资源的访问日志记录,减轻日志压力log_not_found off; # 可选:找不到这些静态资源时不记录错误日志
}
Apache配置示例 (需要启用mod_expires
模块,通常在.htaccess
文件或虚拟主机配置中添加):
<IfModule mod_expires.c>ExpiresActive OnExpiresByType image/jpeg "access plus 1 month"ExpiresByType image/png "access plus 1 month"ExpiresByType image/gif "access plus 1 month"ExpiresByType image/ico "access plus 1 month"ExpiresByType text/css "access plus 1 month"ExpiresByType application/javascript "access plus 1 month"ExpiresByType application/x-javascript "access plus 1 month"ExpiresByType image/svg+xml "access plus 1 month"ExpiresByType application/font-woff "access plus 1 year"ExpiresByType application/font-woff2 "access plus 1 year"
</IfModule><IfModule mod_headers.c><FilesMatch "\.(jpe?g|png|gif|ico|css|js|svg|woff2?)$">Header set Cache-Control "public, max-age=2592000, no-transform"# max-age=2592000 秒约等于30天</FilesMatch>
</IfModule>
“旧貌换新颜”的难题:缓存更新(Cache Busting)
浏览器缓存虽好,但如果你的CSS或JS文件更新了,用户浏览器里还存着旧版本的缓存,那看到的可能就是“穿越”的样式或者出错的功能了。怎么让浏览器知道该去下载新文件呢?这就是“缓存破坏”或“缓存刷新”(Cache Busting)技术了。常见方法有:
- 文件名加版本号: 比如把
style.css
改成style.v1.2.css
。文件名变了,浏览器自然会把它当成新资源去下载。很多前端构建工具会自动帮你做这个。 - URL后加查询参数: 比如
style.css?version=1.2
。但要注意,有些代理服务器可能会忽略查询参数而继续提供旧缓存。所以文件名版本号通常更可靠。
第二重魔法:服务器端页面缓存 —— 给服务器“减负提神”
浏览器缓存主要针对的是静态资源,而且只对用户的“第二次访问”有效。那对于那些动态生成的页面(比如PHP程序从数据库里查出来的数据组成的页面),用户第一次访问时,服务器是不是还得辛辛苦苦地执行一遍PHP、查一遍数据库呢?如果这个页面内容不经常变,或者对于所有未登录用户看到的内容都一样,那我们能不能让服务器也“偷偷懒”,把第一次生成好的HTML页面“存个档”,下次再有用户访问同一个页面,直接把这个“存档”扔给他,省去中间那一堆复杂的计算过程呢?
当然可以!这就是服务器端页面缓存的魔力! 它就像是餐厅把最畅销的几道菜提前做好一份“样板菜”放在保温箱里,有客人点这道菜,直接端上去,速度杠杠的!
常见的“施法”流派:
A. Web服务器自带“法术”(Nginx/Apache级别缓存)
Nginx FastCGI Cache (针对PHP-FPM等FastCGI应用):
Nginx的fastcgi_cache
模块是个非常强大的工具,能把PHP-FPM(或其他FastCGI应用)处理完的动态页面结果缓存起来。
简单配置步骤(在http
块定义缓存路径和参数,在server
块或location
块中启用):
1. 在nginx.conf
的http
块中定义缓存区域:
http {# ...其他http配置...fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=MYAPPCACHE:100m inactive=60m max_size=10g;# /var/nginx/cache: 缓存文件存放路径,确保Nginx运行用户有权限读写# levels=1:2: 缓存目录层级结构# keys_zone=MYAPPCACHE:100m: 缓存键和元数据存放的共享内存区域名和大小# inactive=60m: 60分钟内未被访问的缓存将被清理# max_size=10g: 最大缓存空间fastcgi_cache_key "$scheme$request_method$host$request_uri"; # 定义缓存的唯一键fastcgi_ignore_headers Cache-Control Expires Set-Cookie; # 忽略这些来自后端的头部,自己控制缓存
}
2. 在处理PHP的location
块中启用缓存:
location ~ \.php$ {# ...其他fastcgi配置...include fastcgi_params;fastcgi_pass unix:/run/php/php8.1-fpm.sock; # 你的PHP-FPM地址fastcgi_cache MYAPPCACHE; # 使用上面定义的缓存区域fastcgi_cache_valid 200 301 302 60m; # 对200,301,302状态码的响应缓存60分钟fastcgi_cache_valid any 1m; # 其他状态码缓存1分钟fastcgi_cache_use_stale error timeout invalid_header http_500 http_503; # 后端出错时可使用过期缓存fastcgi_cache_bypass $skip_cache; # 定义一些不走缓存的条件add_header X-Cache-Status $upstream_cache_status; # 在响应头里加个缓存状态,方便调试 (HIT, MISS, BYPASS, EXPIRED)
}
Apache mod_cache
(配合mod_cache_disk
或mod_cache_socache
):
Apache也有类似的缓存模块,比如mod_cache
配合mod_cache_disk
可以将内容缓存到磁盘。配置相对Nginx来说,在某些场景下可能稍显复杂一些,但也能实现类似效果。
需要在httpd.conf或虚拟主机配置中加载模块并进行配置:
<IfModule mod_cache.c><IfModule mod_cache_disk.c>CacheEnable disk /CacheRoot "/var/cache/apache2/mod_cache_disk"CacheDirLevels 2CacheDirLength 1CacheDefaultExpire 3600 # 默认缓存1小时CacheMaxFileSize 1000000 # 最大缓存1MB的文件</IfModule>
</IfModule>
(注意:以上只是极简示例,实际生产环境配置会更复杂,需要仔细阅读官方文档并进行测试。)
B. 应用层缓存“法宝”(如WordPress缓存插件)
对于很多流行的CMS(内容管理系统)如WordPress,有大量优秀的缓存插件(如WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache等)。它们通常更容易上手,点几下鼠标就能开启页面缓存(通常是生成静态HTML文件)、对象缓存(把数据库查询结果等缓存到内存,如Redis/Memcached)等功能。对于不太懂服务器配置的用户来说,这是个不错的选择。
C. 反向代理缓存“大神”(如Varnish Cache, 或Nginx自身)
更高级的玩法是使用专门的反向代理缓存服务器,比如大名鼎鼎的Varnish Cache。它部署在你的Web服务器前端,专门负责缓存和快速响应用户请求,性能极高。Nginx本身也可以配置为强大的反向代理缓存服务器,缓存来自后端应用服务器(比如Tomcat, Node.js应用)的响应。
“魔法失效”的时刻:缓存清除/失效(Cache Invalidation)
缓存虽好,但如果你的网站内容更新了(比如发了一篇新博客,改了一个产品价格),用户看到的还是旧的缓存内容,那可就麻烦了。所以,“如何让缓存及时失效并更新”就成了缓存策略中的核心难题之一(甚至被称为“计算机科学两大难题之一”,另一个是命名规范)。
常见的缓存清除策略有:
- 基于时间的失效: 就是我们前面配置的
expires
,max-age
,fastcgi_cache_valid
,到期自动失效。简单粗暴,但可能不够及时。 - 事件驱动的清除: 当内容更新时,主动触发一个动作去清除相关的缓存。比如,WordPress的缓存插件在你发布或修改文章后,会自动清除对应页面的缓存。对于Nginx FastCGI Cache,有一些第三方模块(如
ngx_cache_purge
)或脚本可以实现按需清除。
双重魔法叠加:浏览器缓存 + 服务器端缓存 = 效果拔群!
浏览器缓存和服务器端缓存并不是“二选一”的关系,它们完全可以(也应该)协同工作,发挥“1+1 > 2”的魔力!
- 服务器端页面缓存: 负责减轻你服务器的压力,让服务器能更快地响应那些可以被缓存的页面请求(尤其是对于第一次访问该页面的用户,或者缓存已过期的用户)。
- 浏览器缓存: 负责让用户的浏览器“记住”那些不常变的静态资源。当用户再次访问,或者访问使用了相同静态资源的其他页面时,直接从本地加载,连服务器都不用麻烦了,速度自然快上加快!
一个典型的流程可能是:用户请求页面 -> CDN(如果有)提供缓存 -> 服务器端缓存提供页面 -> 应用服务器动态生成页面 -> 浏览器缓存静态资源。
施展“缓存魔法”的小贴士:
- 静态资源大胆缓存: 图片、CSS、JS这些不常变的东西,尽管给它们设置超长的浏览器缓存时间(比如一年),然后用文件名版本号或查询参数来控制更新。
- 匿名用户页面重点缓存: 对于未登录用户看到的、内容基本一致的页面(如文章页、列表页),服务器端页面缓存的效果最好。
- 动态个性化内容慎重缓存: 对于包含用户私人信息(如购物车、已登录状态下的用户中心)的页面,服务器端页面缓存要非常小心,甚至不缓存,或者采用更复杂的“片段缓存”(ESI等)技术。
- 测试!测试!再测试! 实施任何缓存策略后,务必彻底测试网站的各项功能,并通过浏览器开发者工具检查HTTP响应头,确认缓存规则是否按预期工作。
- 监控缓存命中率: 了解你的缓存到底有多大效果,命中率高不高,是持续优化的重要依据。
哇哦!是不是感觉“缓存”这个“魔法”也没那么遥不可及了?无论是让用户的浏览器“长点记性”,还是让你的服务器“学会偷懒”,核心目的都是为了让我们的网站像装了“飞行马靴”一样,轻盈、迅捷!虽然配置缓存可能需要你花点时间去研究和测试,但一旦调校得当,它给你的网站性能带来的提升,绝对会让你觉得“物超所值”!Hostol希望这篇“缓存魔法入门与实战”能为你打开一扇通往极致网站速度的大门。赶紧去给你的网站也施展一下这些“加速咒语”吧!
相关文章:
网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)
更多服务器知识,尽在hostol.com 嘿,各位站长和网站管理员朋友们!咱们精心打造的网站,内容再好,设计再炫,如果用户打开它的时候,加载速度慢得像“老牛拉破车”,那体验可就大打折扣了…...

mysql-mysql源码本地调试
前言 先进行mysql源码本地编译:mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …...

PCIe— Legacy PCI
Legacy Model 该器件通过将其引脚置位到控制器来生成中断。 在较旧的系统中,这个控制 器通常是Intel 8259 PIC,有15个IRQ输入和一个INTR输出。 然后,PIC将断 言INTR以通知CPU一个或多个中断正在挂起。 一旦CPU检测到INTR的断言…...

PostgreSQL数据库配置SSL操作说明书
背景: 因为postgresql或者mysql目前通过docker安装,只需要输入主机IP、用户名、密码即可访问成功,这样其实是不安全的,可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接,…...
MySQL 的 super_read_only 和 read_only 参数
MySQL 的 super_read_only 和 read_only 参数 一、参数基本概念 1. read_only 参数 作用:控制普通用户是否只能读取数据影响范围:所有非SUPER权限的用户默认值:OFF(可读写) 2. super_read_only 参数 作用…...

低碳理念在道路工程中的应用-预制路面
一、引子 在上一篇文章里,给大家介绍了预制基层的应用,有人提出,既然基层能够预制,那么,道路面层能不能预制呢,有没有相关的研究成果和应用实例呢?答案是肯定的,在本篇文章中&#x…...

12-后端Web实战(登录认证)
在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以我们今天的主题就是登录认证。最终要实现的效果是&#…...
TIDB创建索引失败 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.
TIDB创建索引失败:解决“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”问题 在使用 TIDB 数据库时,我们有时会遇到创建索引失败的问题。常见的错误信息为: mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…...
Redis 插入中文乱码键
Java 代码: Bean// 静态代理模式: Redis 客户端代理类增强public StringRedisTemplateProxy stringRedisTemplateProxy(RedisKeySerializer redisKeySerializer,StringRedisTemplate stringRedisTemplate,RedissonClient redissonClient) {stringRedisTemplate.setK…...
Mac OS 使用说明
Mac 的启动组合键 了解可通过在启动时按住一个或多个按键来访问的 Mac 功能和工具。 若要使用这些组合键中的任何一个,请在按下电源按钮以开启 Mac 后或在 Mac 开始重新启动后,立即按住相应按键。请一直按住,直至电脑出现对应的行为。 !!!上…...

4.2.2 Spark SQL 默认数据源
在本实战概述中,我们探讨了如何在 Spark SQL 中使用 Parquet 格式作为默认数据源。首先,我们了解了 Parquet 文件的存储特性,包括其二进制存储方式和内嵌的 Schema 信息。接着,通过一系列命令,我们演示了如何在 HDFS 上…...

234. Palindrome Linked List
目录 一、题目描述 方法一、使用栈 方法二、将链表全部结点值复制到数组,再用双指针法 方法三、递归法逆序遍历链表 方法四、快慢指针反转链表 一、题目描述 234. Palindrome Linked List 方法一、使用栈 需要遍历两次。时间复杂度O(n),空间复杂度…...
广州邮科高频开关电源:以创新科技赋能通信能源绿色未来
在数字化浪潮席卷全球的当下,通信网络作为信息社会的基石,其稳定运行对电源系统的可靠性、效率及智能化水平提出了更高要求。作为国内通信电源领域的领军企业,广州邮科凭借其自主研发的高频开关电源技术,以高效节能、智能管控、绿…...
day41 python图像识别任务
目录 一、数据预处理:为模型打下坚实基础 二、模型构建:多层感知机的实现 三、训练过程:迭代优化与性能评估 四、测试结果:模型性能的最终检验 五、总结与展望 在深度学习的旅程中,多层感知机(MLP&…...

无人机报警器探测模块技术解析!
一、运行方式 1. 频谱监测与信号识别 全频段扫描:模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段,覆盖遥控、图传及GPS导航信号。 多路分集技术:采用多传感器阵列,通过信号加权合并提升信噪比,…...
Docker 替换宿主与容器的映射端口和文件路径
在使用 Docker 容器化应用程序时,经常需要将宿主机的端口和文件路径映射到容器中,以便在本地访问容器中的服务和数据。本文将详细介绍如何替换和配置 Docker 容器的端口和文件路径映射。 1. 端口映射 端口映射用于将宿主机的端口转发到容器中的端口&am…...
我的3种AI写作节奏搭配模型,适合不同类型写作者
—不用内耗地高效写完一篇内容,原来可以这样搭配AI ✍️ 开场:为什么要“搭配节奏”写作? 很多人以为用AI写作,就是丢一句提示词,然后“等它写完”。 但你有没有遇到这些情况: AI写得很快,学境…...

Bonjour
Bonjour 是苹果的一套零配置网络协议,用于发现局域网内的其他设备并进行通信,比如发现打印机、手机、电视等。 一句话:发现局域网其他设备和让其他设备发现。 Bonjour 可以完成的工作 IP 获取名称解析搜索服务 实际应用场景示例࿰…...

华为云Flexus+DeepSeek征文 | 基于Dify和DeepSeek-R1开发企业级AI Agent全流程指南
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 环境准备 2.1 华为云资源准备 2.1 实…...

HarmonyOS-ArkUI固定样式弹窗(1)
固定样式弹窗指的就是ArkUI中为我们提供的一些具备界面模板性质的弹窗。样式是固定的,我们可以决定在这些模板里输入什么样的内容。常见的有,警告弹窗, 列表选择弹窗, 选择器弹窗,对话框,操作菜单。 下图是本文中要讲到的基类固定样式弹窗,其中选择器弹窗没有包含在内,…...

痉挛性斜颈相关内容说明
一、颈部姿态的异常偏移 痉挛性斜颈会打破颈部原本自然笔直的状态,让颈部像被无形的力量牵引,出现不自主的歪斜、扭转。它就像打乱了颈部原本和谐的 “平衡游戏”,使得颈部姿态偏离正常,影响日常的体态与活动。 二、容易察觉…...
C语言| 函数参数传递指针
C语言| 拷贝传递(指针控制内存单元)-CSDN博客 【函数参数传指针和传数据的区别】 如果希望在另外一个函数中修改本函数中变量的值,那么在调用函数时只能传递该变量的地址。 1 普通变量,传递它的地址,可以直接操作该变量的内存空间。 举例…...

【25-cv-05917】HSP律所代理Le Petit Prince 小王子商标维权案
Le Petit Prince 小王子 案件号:25-cv-05917 立案时间:2025年5月28日 原告:SOCIETE POUR LOEUVRE ET LA MEMOIRE DANTOINE DE SAINT EXUPERY - SUCCESSION DE SAINT EXUPERY-DAGAY 代理律所:HSP 原告介绍 《小王子》&#x…...
MyBatis 动态 SQL 详解:灵活构建强大查询
MyBatis 的动态 SQL 功能是其最强大的特性之一,它允许开发者根据不同条件动态生成 SQL 语句,极大地提高了 SQL 的灵活性和复用性。本文将深入探讨 MyBatis 的动态 SQL 功能,包括 OGNL 表达式的使用以及各种动态 SQL 元素(如 if、c…...
从 “金屋藏娇” 到 自然语言处理(NLP)
文章目录 从两个问题理解自然语言处理(NLP)1、汉武帝喜欢阿娇吗1. 政治联姻的背景2. 早期情感与后期疏远3. 历史评价的复杂性4. 现代视角结论 2、刘彻和淮南王关系一、背景:诸侯王与中央的矛盾二、刘彻与刘安的互动三、深层原因与历史评价结论…...

vue3 ElMessage提示语换行渲染
在 ElMessage.error 中使用换行符 \n 并不会实现换行,因为 ElMessage 默认会将字符串中的换行符忽略。要实现换行显示,可以使用 HTML 标签 <br> 并结合 ElMessage 的 dangerouslyUseHTMLString 选项。以下是实现换行提示的代码示例: i…...

Java 微服务架构设计:服务拆分与服务发现的策略
Java 微服务架构设计:服务拆分与服务发现的策略 微服务架构作为一种热门的软件架构风格,在 Java 领域有着广泛的应用。它通过将系统拆分为一组小型服务来实现更灵活、可扩展的系统设计。在微服务架构中,服务拆分和服务发现是两个关键环节。本…...

华为OD机试真题——二叉树中序遍历(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《二叉树中序遍历》: 目录 …...
解决 Go 中 `loadinternal: cannot find runtime/cgo` 错误
在 Go 开发中,loadinternal: cannot find runtime/cgo 是一个相对不常见但可能令人困惑的错误。这个错误通常与 CGO 的使用和配置有关。本文将探讨这个错误的成因,并提供解决方案,帮助你在未来的开发中避免类似问题。 错误背景 在 Go 项目中…...

VSCode + GD32F407 构建烧录
前言 最近调试一块 GD32F407VET6(168Mhz,8Mhz晶振) 板子时,踩了一些“启动失败”的坑。本以为是时钟配置有误,最后发现是链接脚本(.ld 文件)没有配置好,导致程序根本没能正常执行 ma…...