A TCP connection has two independent directions. A half-close (shutdown(SHUT_WR), CloseWrite in Go) tells the peer “I am done sending” (it sees EOF) while you can still read its answer.