Windows 不支持 syscall.Flock 因其无 flock(2) 系统调用,需用 gofrs/flock 等跨平台库;sync.Mutex 仅限单进程内有效,多进程必须用文件锁。
Go 本身没有跨平台的内置文件锁,syscall.Flock 在 Linux/macOS 可用,但 Windows 不支持;直接用 sync.Mutex 只能保同

syscall.Flock 加锁时为什么总在 Windows 报错?因为 Windows 不支持 flock(2) 系统调用,syscall.Flock 调用会直接返回 ENOSYS 或类似错误。这不是代码写错了,而是系统级不兼容。
LOCK_EX 是独占锁,LOCK_SH 是共享锁,但 Windows 上二者都无效LOCK_NB(非阻塞),错误类型仍是系统不支持,不是“被占用”github.com/gofrs/flock —— 它在 Windows 下自动 fallback 到 CreateFile + FILE_SHARE_NONE 模拟锁行为sync.Mutex,什么时候必须用文件锁?sync.Mutex 只在单个 Go 进程内有效;只要启动两个独立的 ./myapp 二进制,它就完全失效。
sync.Mutex 最轻量、无系统依赖flock 类系统级锁sync.Mutex 却部署多个实例,锁形同虚设os.O_APPEND 保证单次 Write 原子追加,但不防多进程同时写——仍可能行交错(如两行内容挤在同一行)flock 的正确打开方式推荐直接使用 github.com/gofrs/flock,它封装了系统差异,API 简洁,且默认带超时和重试逻辑。
fileLock := flock.New("/path/to/lockfile") —— 锁文件路径可任意,不需预先存在locked, err := fileLock.Lock();非阻塞:locked, err := fileLock.TryLock()
fileLock.Unlock(),defer 里放最安全data.json 自身),应另建 data.json.lock
0600,避免被其他用户干扰真正容易被忽略的点是:锁的粒度和生命周期。别为了“保险”一直拿着锁做 IO 或网络请求;写入前加锁、写完立刻解锁,中间任何耗时操作(如 HTTP 调用、sleep、复杂计算)都应移出临界区——否则并发吞吐直接归零。