Bloqueio de Golang e não bloqueio

Estou um pouco confuso sobre como o Go lida com E / S sem bloqueio. As APIs parecem principalmente síncronas comigo e, ao assistir apresentações no Go, não é incomum ouvir comentários como "e os bloqueios de chamada"

O Go está usando E / S de bloqueio ao ler arquivos ou rede? Ou existe algum tipo de mágica que reescreve o código quando usado de dentro de uma rotina Go?

Vindo de um background C #, isso parece muito intuitivo, em C # temos oawait palavra-chave ao consumir APIs assíncronas. O que comunica claramente que a API pode gerar o encadeamento atual e continuar mais tarde dentro de uma continuação.

Então TLDR; O Go bloqueará o encadeamento atual ao fazer E / S dentro de uma rotina Go, ou será transformado em um C # como assíncrono aguardando máquina de estado usando continuações?