I'll take a swing. These aren't 'destroy computer science' worthy, but they are a MASSIVE step back in the development of languages.
:.:.:
Go lacks a lot of basic functionality a lot of other languages take for granted. I.E.:
In Rust you can type
fn id<T> ( item:T) -> T
{
return item;
}
And you assign the type to the function. This is possible in Go by double casting the type. Which is really messy, and what java did in 2004 for generic functions (and was ultimately useless).
:.:.:
Lets say you want to iterate over a array in say java.
for(byte a: bytes[]
{
x += a;
}
This also doesn't exist in Go. Yet does in python, java, and several others thanks to iterators.
:.:.:
Lets say I'm adding vectors and dark magic has told me to use '-' for the dot product. In most languages (Rust, C, C++, Haskell) this is completely possible, as - is just a function. __subtract__() in rust.
You can't in Go.
:.:.:
Now lets talk about pointers. When you want to signify data doesn't exist in Go you pass a null pointer (nil, 0x0). This is wrong on almost every single level. Your not only creating a back door, but your by passing your entire type system.
The only thing that stops this from being common practice is that Go has such good message handling, but it still exists! Why?!
:.:.:
Immutable variables, data structures, etc. are a thing of beauty. In Rust and Haskell all values are immutable by default, but most languages (C, C++, Java) let you delcare variables, data structures, etc. as immutable.... Go doesn't.
:.:.:
Go has no support for turning off compiler safety features. Much like Rust offers the
unsafe{ ... }
tag for isolating code that may do strange things, go doesn't.
:.:.:
TL;DR
Go doesn't do anything new.
Actually it takes a step back.