The vclock package offers full vector clock support for the Go language. Vector clocks allow recording and analyzing the inherent partial ordering of events in a distributed system in a comfortable way. The following pair of blog posts from Basho describes them in a nicely understandable way:

The following features are offered by the vclock package, in addition to basic event tracking:

  • Compact serialization and deserialization
  • Flexible truncation (min/max entries, min/max update time)
  • Unit-independent update times
  • Traditional merging
  • Fast and memory efficient

API documentation

The API documentation may be accessed via the package path itself:


Here is a simple example simulating a few sequential and concurrent operations and comparing the resulting vector clocks.

package main import ( "fmt" "" ) func main() { vc1 := vclock.New() vc1.Update("A", 1) vc2 := vc1.Copy() vc2.Update("B", 0) fmt.Println(vc2.Compare(vc1, vclock.Ancestor)) // true fmt.Println(vc1.Compare(vc2, vclock.Descendant)) // true vc1.Update("C", 5) fmt.Println(vc1.Compare(vc2, vclock.Descendant)) // false fmt.Println(vc1.Compare(vc2, vclock.Concurrent)) // true vc2.Merge(vc1) fmt.Println(vc1.Compare(vc2, vclock.Descendant)) // true data := vc2.Bytes() fmt.Printf("%#v\n", string(data)) vc3, err := vclock.FromBytes(data) if err != nil { panic(err) } fmt.Println(vc3.Compare(vc2, vclock.Equal)) // true }

Source code

To obtain the source code, use Bazaar to download it from Launchpad:

$ bzr branch lp:vclock/v1

Reporting bugs

Please report bugs at:

Building and installing

Just use the go command: $ go get


The vclock package is made available under the simplified BSD license.


Gustavo Niemeyer <>