Yeah I guess I'd phrase it as 3 kinds of "complexity"
Rust is complex because the compiler has many ways to say "No I won't compile that, it might be wrong".
C++ is complex because it requires the programmer to understand every feature used in the codebase. (e.g. Will the compiler warn me if I use inheritance and dynamic dispatch wrong? I'm not sure. I find code with inheritance hard to read.)
Go _code_ is complex because the language is too simple. (if err != nil is waterbed complexity)
It does, which is where the social aspect comes in: You're expected to make every reasonable effort not to use it, even if that comes at slight costs in performance, because practically speaking people are terrible at making those judgements.
Sometimes works well. Sometimes, unfortunately, it leads to bullying.
I always pictured that in a professional setting, engineering management would have an edict that `unsafe` is simply not allowed, or possibly, they allow it with extensive code review by multiple engineers.
And that there would also be a lot of people trying to implement a double-linked list and finding themselves having to sprinkle "unsafe" all over the place to satisfy the borrow checker.
Rust is complex because the compiler has many ways to say "No I won't compile that, it might be wrong".
C++ is complex because it requires the programmer to understand every feature used in the codebase. (e.g. Will the compiler warn me if I use inheritance and dynamic dispatch wrong? I'm not sure. I find code with inheritance hard to read.)
Go _code_ is complex because the language is too simple. (if err != nil is waterbed complexity)