用 useragent 库解析 ua 字符串最可靠,因其基于持续更新的真实数据库,能识别95%以上常见组合;需检查 browser().name 非空、避免精确匹配、手动检测 micromessenger 等关键词,并建议缓存优化性能。

用 useragent 库解析 UA 字符串最可靠
直接正则硬匹配 UA 是坑最多的做法——Chrome、Edge、Firefox 的 UA 格式每年变,iOS 和 Android 的版本号嵌套层级不同,还有各种伪装 UA(比如 curl、Postman、微信内置浏览器)。useragent 库(github.com/mssola/useragent)基于真实 UA 数据库持续更新,能识别 95% 以上常见组合。
安装:
go get github.com/mssola/useragent
基本用法:
ua := useragent.Parse("Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1")-
ua.Browser()返回Browser结构体,含Name(如"Safari")、Version(如"17.5") -
ua.OS()返回OS结构体,含Name(如"iOS")、Version(如"17.5")
注意 ua.Browser().Name 的返回值不是固定字符串
它会根据 UA 实际内容返回标准名称,但不是所有 UA 都能识别:空字符串或 "Other" 表示未命中规则。比如某些爬虫 UA("Go-http-client/1.1")解析后 ua.Browser().Name 就是空,ua.OS().Name 也是空。
安全写法:
- 永远检查
ua.Browser().Name != ""再使用 - 不要用
== "Chrome"做判断,改用strings.Contains(ua.Browser().Name, "Chrome")(因为可能返回"Chrome Mobile") - 微信内置浏览器 UA 中
Browser().Name是"MQQBrowser",不是"WeChat";QQ 浏览器是"QQBrowser"
遇到 iOS/Android WebView 场景要额外处理
WebView 的 UA 通常包含 "WebKit" 和原始系统信息,但 useragent 默认会把 iOS WebView 识别为 Safari,Android WebView 识别为 Android Browser 或 Chrome —— 这没问题,但如果你需要区分「是否在微信里打开」,仅靠 UA 解析不够。
可行方案:
- 先用
useragent提取基础信息 - 再手动检查 UA 字符串是否含
"MicroMessenger"(微信)、"AlipayClient"(支付宝)、"QQ/"(QQ) - 注意:iOS 微信 UA 里有
"iPhone OS",Android 微信有"Android",但ua.OS().Name仍能正确返回"iOS"或"Android"
性能与并发安全要注意
useragent.Parse() 是无状态纯函数,可并发调用,但每次调用都做完整字符串扫描。如果高频解析(比如每秒上千次),建议加一层缓存,键用 UA 字符串前 64 字节(足够区分大多数 UA,又避免哈希开销)。
缓存示例(简单版):
var uaCache sync.Map // string → *useragent.UserAgent
func parseUA(s string) *useragent.UserAgent {
if u, ok := uaCache.Load(s[:min(len(s), 64)]); ok {
return u.(*useragent.UserAgent)
}
u := useragent.Parse(s)
uaCache.Store(s[:min(len(s), 64)], u)
return u
}
真正容易被忽略的是:某些老旧 Android UA(如 Android 4.x)的 Build/ 段落极长,useragent 解析时会多消耗几微秒——如果业务对延迟极其敏感,且已知只处理现代 UA,可以提前截断字符串到 256 字符再解析。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











