What I like about Go is that each co-routine is entirely synchronous, and the only concurrency primitives you're given are channels and mutexes. This makes your code so simple and easy to understand.
I just looked up Kotlin's co-routines, and there are a number of annoying hoops you need to jump through:
1. Co-routines can only be built by calling runBlocking or coroutineScope.
2. Functions that are async buy should act like blocking calls in a co-routine need to be marked with `suspend`
3. There are a bunch of primitives you need to use like `launch` or `async`.
4. There are built-in options to make the co-routines lazy, but it makes the API feel sloppy.
5. Rather than locks, Kotlin encourages explicit thread dispatching. Some times you need to do this in Go too, like when using a C library, but in general it's rare.