如何在GO中实现跨平台文件锁定

How to implement cross platform file lock in GO

我需要在 GO 中实现以下行为:

  1. 一个进程应该能够读取文件,无论是否有任何其他进程已锁定文件以进行写入
  2. 一个进程在写入文件之前应该获得一个写锁。这是为了保证多个进程不能写入同一个文件
  3. 一个进程不应该等待获得写锁,如果它不能获得锁它应该继续

对于基于 UNIX 的系统,GO 中的 syscall 包定义了 flock 函数,可用于通过以下方式实现上述行为:

  1. 使用 syscall.flock 函数与 LOCK_EX | LOCK_NB 在写入文件之前尝试获取锁
  2. 在读取文件之前不检查任何锁

GO 中 Windows 的系统调用包,不包括 flock。鉴于此,我如何才能最好地编写可以跨平台执行并具有上述行为的代码?

我想尝试在不进行 OS 特定调用或使用不安全的情况下实现这一点。

PS: 我不想强制文件锁定,进​​程会在执行文件操作前检查文件锁定

使用编译器标志。

windows 的标志:

// +build windows,!linux
...

linux 的标志:

// +build linux,!windows
...

如果要使用平台原生锁定功能

一种解决方法可能是分配资源,这些资源(据说)是跨平台的单例,例如绑定到端口并依赖于它只能进行一次。绑定操作的错误条件将是决定因素。

就我个人而言,我会选择使用平台本机选项,只创建一个界面,以便可以轻松添加测试,从而确保不会出现问题。