应直接使用go标准库math.sin、math.cos等函数,避免自行实现;需将度数转为弧度,配合haversine公式计算地理距离,并注意float64精度、单位一致性和地球模型选择。

Go 里直接用 math.Sin 和 math.Cos 就行,别自己重写三角函数
Go 标准库的 math 包已经提供了高精度、跨平台、经过充分测试的三角函数实现,math.Sin、math.Cos、math.Asin 等完全满足地理距离计算需求。自己用泰勒展开或查表实现不仅没优势,反而容易引入精度误差和边界 bug(比如输入超出 [-π, π] 时未归一化)。
常见错误是传入度数而非弧度——所有 math 三角函数只接受弧度。必须先用 math.Pi / 180.0 转换:
lat1Rad := lat1 * math.Pi / 180.0 lon1Rad := lon1 * math.Pi / 180.0
Haversine 公式才是地理距离计算的实际入口
三角函数只是工具,真正算两点间球面距离的是 Haversine 公式。它用 math.Sin、math.Cos 和 math.Asin 组合出稳定、数值友好的结果,避免大角度下的浮点误差。
- 地球半径取值影响结果:常用
6371.0km(平均半径),若需更高精度可按 WGS84 椭球模型用6378.137km(赤道半径),但多数场景差异小于 0.2% - 注意
math.Asin的输入范围是 [-1, 1],Haversine 中的中间值可能因浮点误差略超 1,需用math.Max(0, math.Min(1, x))截断 - 不要用
math.Atan2替代math.Asin——虽然数学等价,但 Haversine 原生形式更稳定,且math.Atan2在极点附近易受除零干扰
用 float64 而不是 float32,否则经纬度小数点后 5 位就失真
经度 121.4737° 这类常见坐标,用 float32 表示时有效位数仅约 7 位,导致 1e-5 级别误差——在 1km 距离内可能偏差百米以上。Haversine 对输入敏感,微小角度误差会通过正弦函数放大。
Go语言(Golang)1.26.0版本提供 Go 官方 Windows amd64 MSI 安装包下载入口,版本号 1.26.0,可用于旧项目维护、兼容性测试和指定版本开发环境配置。
实操建议:
- 所有坐标变量声明为
float64 - 读取 JSON 或 CSV 时,确保解析器返回
float64(如json.Unmarshal默认就是) - 如果调用外部 API 返回
float32,立刻转成float64再参与计算
别忽略单位一致性:输入是度,输出是米还是公里?
公式本身无单位,结果取决于你乘的地球半径。最容易踩的坑是混用单位:
- 用
6371.0km → 结果单位是 km - 用
6371000.0m → 结果单位是 m - 如果输入坐标是 DMS(度分秒)格式,必须先转成十进制度再进公式;别直接把 121°28′25″ 当作 121.2825 处理
- 某些 GPS 设备或协议(如 NMEA)返回的纬度/经度是整数 × 10⁶(如 121473700 表示 121.4737°),漏掉除法会得到荒谬结果
最常被忽略的其实是地球并非完美球体——Haversine 在两极或跨经度 180° 附近误差可达 0.5%,若项目要求亚公里级精度,得切到 Vincenty 或 geodesy 库,但那就不是三角函数层面的问题了。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










