
通过读取 HTTP 请求头中的 Accept-Language 字段,Go 程序可准确获取用户浏览器声明的语言偏好(如 en-US,en;q=0.8,ro;q=0.6),从而实现多语言页面的动态切换。
通过读取 http 请求头中的 `accept-language` 字段,go 程序可准确获取用户浏览器声明的语言偏好(如 `en-us,en;q=0.8,ro;q=0.6`),从而实现多语言页面的动态切换。
在 Go 的标准 net/http 包中,没有专门封装的“获取本地化语言”函数(如 PHP 的 $_SERVER['HTTP_ACCEPT_LANGUAGE']),但可通过直接访问请求头轻松实现等效功能:使用 r.Header.Get("Accept-Language") 即可提取客户端发送的语言优先级列表。
以下是一个完整示例:
package main
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
lang := r.Header.Get("Accept-Language")
fmt.Printf("Client's Accept-Language: %s\n", lang)
// 可选:解析并选取最匹配的语言(例如取第一个非空主语言标签)
if lang != "" {
primaryLang := parsePrimaryLanguage(lang)
fmt.Fprintf(w, "Detected language: %s", primaryLang)
} else {
fmt.Fprintf(w, "No Accept-Language header provided")
}
}
}
// parsePrimaryLanguage 提取 Accept-Language 中首选语言(如 "en-US" → "en")
func parsePrimaryLanguage(header string) string {
for _, part := range strings.Split(header, ",") {
langTag := strings.TrimSpace(strings.Split(part, ";")[0])
if langTag != "" {
// 提取主语言码(如 en-US → en,zh-CN → zh)
if idx := strings.IndexByte(langTag, '-'); idx > 0 {
return strings.ToLower(langTag[:idx])
}
return strings.ToLower(langTag)
}
}
return "en" // 默认回退
}
func main() {
http.HandleFunc("/", index)
fmt.Println("Server running on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("Failed to start server:", err)
}
}
⚠️ 注意事项:
- Accept-Language 是客户端主动发送的请求头,不可靠且可被伪造,仅作推荐语言依据,不应替代用户显式选择或持久化设置;
- 实际多语言服务中,建议结合 Cookie、URL 路径(如 /zh/home)或用户账户配置进行最终语言判定;
- 解析时需注意 q 参数(权重值),真实场景推荐使用成熟库(如 golang.org/x/text/language)进行 RFC 4647 兼容的匹配与排序;
- 浏览器未设置语言时该 Header 可能为空,务必做空值判断。
综上,r.Header.Get("Accept-Language") 是 Go 中获取用户语言偏好的标准起点,配合合理解析与兜底策略,即可构建健壮的国际化 Web 应用。











