Surely Go has a few idiosyncrasies that can be annoying or glaring to people coming in from different languages. Some are actual practical issues (error bubbling that results in repetitive boilerplate, the capitalization of public functions / variables, implicit interfaces) but others are more like ‘weird but whatever’.

I never paid much attention to the impact of disallowing import cycles. Mutually inclusive packages are a pain to manage by any reference system (self-reference, hint, hint). But I see it can be an issue for your code organization when coming in from a more permissive system. However, in reality it doesn’t restrict anything, just forces some extra creativity on the side to plan your hierarchy.

Also, when talking about channels and go routines, you’re glossing over them skipping that this is the whole point of Go — the first class concurrency constructs. As opposed to Rust, for example, goroutines are cheap to spawn (virtually free, from a system resource perspective) as opposed to threads. You have many more options to sync go routines in Go (waiting for one another or just sync’ing some of them up), whereas in Rust you’re mostly as the mercy of the system.