Is a Go channel equivalent to a Haskell tvar ?

A go channel is just a queue with a configurable amount of buffering. Buffering 0 is the most interesting as it creates a “rendezvous” channel which syncs the sender and the receiver.

A channel of size 1 is a bit like an mvar but with support for only take and put.

Closer to mvar. Tvars support full transactional semantics.