Go channels are implemented internally as the hchan struct in src/runtime/chan.go, which manages a circular buffer, send/receive queues, and a mutex lock.
type hchan struct {
qcount uint // total data in the queue
dataqsiz uint // size of the circular queue
buf unsafe.Pointer // points to an array of dataqsiz elements
elemsize uint16
closed uint32
timer *timer
elemtype *_type
sendx uint
recvx uint
recvq waitq // list of recv waiters
sendq waitq // list of send waiters
lock mutex
}