
Go 1.8 内置原生 HTTP/2 支持,只需启用 HTTPS(TLS),net/http 包会自动协商并启用 HTTP/2,无需导入 golang.org/x/net/http2 或手动配置。
go 1.8 内置原生 http/2 支持,只需启用 https(tls),`net/http` 包会自动协商并启用 http/2,无需导入 `golang.org/x/net/http2` 或手动配置。
自 Go 1.6 起,标准库 net/http 已深度集成 HTTP/2 协议支持;到 Go 1.8 时,该支持已完全稳定且开箱即用。关键前提是:必须使用 TLS(即 HTTPS)。HTTP/2 在 Go 的 http.Server 中默认仅通过 TLS 启用(符合 RFC 7540 规范),明文 HTTP(h2c)需额外配置且不被标准库自动启用。
以下是最简、合规的 HTTP/2 服务示例:
package main
import (
"log"
"net/http"
"os"
)
func main() {
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
srv := &http.Server{
Addr: ":443",
Handler: http.FileServer(http.Dir(cwd)),
}
// ✅ 无需 import "golang.org/x/net/http2"
// ✅ 无需 http2.ConfigureServer()
// 只要调用 ListenAndServeTLS,Go 自动启用 HTTP/2(若客户端支持)
log.Fatal(srv.ListenAndServeTLS("server.crt", "server.key"))
}? 注意事项:
- 证书文件(
server.crt和server.key)必须有效;自签名证书需在客户端显式信任,否则浏览器可能拒绝连接或降级为 HTTP/1.1。 - 客户端必须支持 ALPN(Application-Layer Protocol Negotiation),现代主流浏览器和
curl(≥7.47.0 + OpenSSL/NSS)均满足。 - 若使用
http.ListenAndServeTLS(而非srv.ListenAndServeTLS),同样自动启用 HTTP/2,但推荐显式使用http.Server实例以利于后续配置扩展(如超时、中间件等)。 - 明文 HTTP/2(h2c)不被
net/http默认支持;如确有需求,需手动注册 h2c 升级机制,此时才需引入golang.org/x/net/http2并调用http2.ConfigureServer(srv, nil),但这属于非常规场景。
✅ 总结:Go 1.8+ 的 HTTP/2 是「零配置 TLS 优先」设计——只要提供合法 TLS 证书并调用 ListenAndServeTLS,服务即自动兼容 HTTP/2,简洁、安全、无需外部依赖。

















