必须调用w.Header().Set("Content-Type", "text/html; charset=utf-8")并仅写HTML内容体,否则浏览器因缺失有效Content-Type而显示源码而非渲染页面。
用 net/http 起一个能返回 HTML 的最简服务
go 自带 net/http 包,不用装第三方框架就能跑网页。关键不是“怎么写网页”,而是“怎么让 go 把 html 文本正确发给浏览器”。
常见错误是直接 fmt.Println HTML 字符串,或者忘了设 Content-Type,结果浏览器当成纯文本显示源码。
- 必须调用
w.Header().Set("Content-Type", "text/html; charset=utf-8") - 用
w.Write([]byte(html))或fmt.Fprintf(w, "%s", html)输出,别用fmt.Println - 监听地址建议用
":8080",避免权限问题;本地开发别硬绑":80"
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprintf(w, "<h1>Hello from Go</h1><p>It works.</p>")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
模板渲染要用 html/template,不能用 text/template
想动态插数据(比如用户名、列表),就得用模板。很多人误用 text/template,它不会自动转义 HTML 特殊字符,容易引发 XSS。
html/template 会把 、<code>>、" 等自动转成 <,更安全;且函数名、变量名、语法完全一样,换包就行。
- 导入必须是
"html/template",不是"text/template" - 模板文件后缀建议用
.html,但不是强制;template.ParseFiles()才真正读文件 - 执行时传入的数据结构字段必须首字母大写(导出),否则模板里取不到
静态文件(CSS/JS/图片)得显式注册 ServeFile 或 FileServer
Go 的 http.ServeMux 默认不提供静态文件服务。浏览器请求 /style.css,你会收到 404,哪怕文件就在当前目录。
两种常用方式:一是用 http.ServeFile 单独挂载某个文件,二是用 http.FileServer 挂一整个目录。后者更实用。
- 用
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static")))) - 确保
./static目录存在,且路径大小写敏感(Linux/macOS 下Style.css≠style.css) - HTML 中引用要带前缀:
<link href="/static/style.css" rel="stylesheet">
生产环境别直接用 ListenAndServe,至少加超时控制
本地跑着没问题,但一旦部署,没超时的服务器容易被慢连接拖垮。Go 1.8+ 推荐用 http.Server 结构体手动配置。
默认的 http.ListenAndServe 没法设 ReadHeaderTimeout、WriteTimeout,也没法优雅关机。
- 必须显式创建
http.Server,设置Addr、Handler和超时字段 -
ReadTimeout防慢速攻击,WriteTimeout防响应卡住;一般设 5–30 秒 - 启动后用
server.ListenAndServe(),别再用顶层的ListenAndServe
模板和静态文件逻辑不变,只是套一层 server 控制。真正上线时,这层控制绕不开。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











