fslock 
fslock provides a cross-process mutex based on file locks that works on windows and *nix platforms.

image: public domain
(don't ask)
fslock relies on LockFileEx on Windows and flock on *nix systems. The timeout
feature uses overlapped IO on Windows, but on *nix platforms, timing out
requires the use of a goroutine that will run until the lock is acquired,
regardless of timeout. If you need to avoid this use of goroutines, poll
TryLock in a loop.
Variables
var ErrLocked error = trylockError("fslock is already locked")
ErrLocked indicates TryLock failed because the lock was already locked.
var ErrTimeout error = timeoutError("lock timeout exceeded")
ErrTimeout indicates that the lock attempt timed out.
type Lock
type Lock struct {
}
Lock implements cross-process locks using syscalls.
func New
func New(filename string) *Lock
New returns a new lock around the given file.
func (*Lock) Lock
func (l *Lock) Lock() error
Lock locks the lock. This call will block until the lock is available.
func (*Lock) LockWithTimeout
func (l *Lock) LockWithTimeout(timeout time.Duration) error
LockWithTimeout tries to lock the lock until the timeout expires. If the
timeout expires, this method will return ErrTimeout.
func (*Lock) TryLock
func (l *Lock) TryLock() error
TryLock attempts to lock the lock. This method will return ErrLocked
immediately if the lock cannot be acquired.
func (*Lock) Unlock
func (l *Lock) Unlock() error
Unlock unlocks the lock.