游客发表
用Go写网站,网站第一件让人上瘾的网站事是编译。你敲下 go build,网站一个二进制文件就躺在那儿了,网站没有node_modules,网站没有虚拟环境,网站没有依赖地狱。网站扔到服务器上直接跑。网站我第一次把Go服务部署到一台只有512M内存的网站VPS上时,盯着 top 里那个占用不到10M的网站进程看了好几秒——这东西真的在跑吗?
标准库的 net/http 足够撑起一个正经网站。很多人从其他语言转过来,网站习惯性地先找框架,网站找着找着发现好像不太需要。网站http.ListenAndServe 两行代码就能起服务,网站路由用 http.HandleFunc 注册,网站模板用 html/template 渲染。我之前用Go重写了一个PHP的小型内容站,总共不到400行代码,包括数据库查询、模板渲染和静态文件服务。PHP那边原来用了三个Composer包加一个框架。
Go 1.22 之前,标准库的路由不支持路径参数。/user/123 这种URL你得自己解析 r.URL.Path,或者引入 gorilla/mux、chi 这类第三方库。1.22之后标准库加了 GET /user/{ id} 的写法,虽然功能不算丰富,但覆盖八成场景没问题。我现在的做法是:能用标准库就用标准库,需要中间件链或者路由分组再上chi。chi的API设计跟标准库几乎无缝衔接,r.Get、r.Post、r.Use,学起来没什么负担。
有个细节值得说:Go的 http.Handler 接口只有一个 ServeHTTP(w, r) 方法。这意味着任何实现了这个接口的东西都能当处理器用。中间件本质上是接受一个Handler返回另一个Handler的函数。这个设计极其简洁,但组合起来非常灵活。我写过一个限流中间件,核心逻辑就是一个带计数器的闭包,二十行不到。
Go的 html/template 语法初看有点怪,{ { .Title}}、{ { range .Items}} 这种。用熟了之后发现它自动做HTML转义,防XSS这块省了不少心。模板继承用 { { define}} 和 { { template}} 组合,虽然不如Jinja2或Blade那么顺手,但够用。
性能方面,模板在启动时解析一次,之后每次渲染就是执行预编译的代码。我做过一个粗糙的benchmark:同一个页面,Go模板渲染耗时大约是PHP Twig的三分之一。当然这个对比不太严谨,但体感上确实快。
database/sql 配合 go-sql-driver/mysql 或 pgx,写查询直接了当。没有ORM也能活,rows.Scan 一个个字段扫进去就行。我试过GORM,功能全但有时候生成的SQL让人摸不着头脑。小项目我倾向于手写SQL,控制力更强。
静态文件用 http.FileServer 一行搞定。生产环境前面挂个Nginx或者Caddy处理TLS和缓存,Go服务只管动态请求。这个组合很稳。
Go没有内置的热重载。改完代码得手动重启。有人用 air 或 reflex 这类工具监听文件变化自动编译重启。我用了段时间air,配置简单,air init 生成配置文件,air 启动就行。不过后来我发现自己改代码的频率没那么高,手动 Ctrl+C 再 go run . 也就多花两秒,索性省了这层工具。
编译速度快是Go开发体验的核心。一个中等规模的Web项目,增量编译通常一两秒。这个反馈循环让人愿意频繁地改代码、跑测试。
如果你追求部署简单、运行资源少、并发处理强,Go很合适。API服务、微服务、内部工具、中小型网站,这些场景Go都能胜任。但如果你需要丰富的CMS生态、大量现成插件、设计师友好的模板系统,PHP或Node可能更省事。Go不是银弹,它只是把某些事情做得特别干净。
我现在手上三个站点跑在Go上,最老的那个已经稳定运行两年多,没重启过。每次 git push 触发CI构建,新二进制替换旧文件,systemctl restart,完事。这种简单让人踏实。
友情链接