Я наконец нашел пакет go, который может заблокировать файл.
Вот репозиторий: https://github.com/juju/fslock
go get -u github.com/juju/fslock
этот пакет делает именно то, что говорит
fslock предоставляет межпроцессный мьютекс, основанный на блокировках файлов, который работает на платформах Windows и * nix.fslock использует LockFileEx в Windows и работает в системах * nix.Функция тайм-аута использует перекрывающийся ввод-вывод в Windows, но на платформах * nix для тайм-аута требуется использование программы, которая будет работать до тех пор, пока не будет получена блокировка, независимо от времени ожидания.Если вам необходимо избежать такого использования подпрограмм, опросите TryLock в цикле.
Чтобы использовать этот пакет, сначала создайте новую блокировку для файла блокировки
func New(filename string) *Lock
Этот APIсоздаст файл блокировки, если он уже не существует.
Затем мы можем использовать ручку блокировки, чтобы заблокировать (или попробовать заблокировать) файл
func (l *Lock) Lock() error
Существует также версия тайм-аутаВышеупомянутая функция, которая будет пытаться получить блокировку файла до истечения времени ожидания
func (l *Lock) LockWithTimeout(timeout time.Duration) error
Наконец, если вы закончили, снимите полученную блокировку с помощью
func (l *Lock) Unlock() error
Очень базовая реализация
package main
import (
"time"
"fmt"
"github.com/juju/fslock"
)
func main() {
lock := fslock.New("../lock.txt")
lockErr := lock.TryLock()
if lockErr != nil {
fmt.Println("falied to acquire lock > " + lockErr.Error())
return
}
fmt.Println("got the lock")
time.Sleep(1 * time.Minute)
// release the lock
lock.Unlock()
}