Well adding templates to Go won't break channel or goroutines. Whether exception handling is a good thing or not is a very difficult issue. Requires too much knowledge of compiler construction and language design that I could follow. Anyhow, there are good reasons not to have exception handling. That Go does not have them is on purpose and not just a sign for the language being simple. Swift also does not have it, but it is probably because exceptions being thrown would make the instance counters used for ARC become corrupted.
Since Go does not have dynamic dispatch there is no way to implement method overwriting (overwriting the inherited method) without changing the compiler. The reason Go does not have inheritance (no method overwriting, no inheritance) is that Robert Pike is known to dislike OOP. What is called "embedding" in Go is in OOP terms nothing but delegation. Groovy has for example the @Delegate AST transformation which is a very similar thing.
Whether lack of inheritance is a good thing or not is questionable. Not being able to overwrite an inherited method removes a great deal of flexibility and it does not cost that much performance as C++ shows. Have a look at at the following Go code taken from
here:
type Base struct {}
func (Base) Magic() { fmt.Println("base magic") }
func (self Base) MoreMagic() {
self.Magic()
self.Magic()
}
type Foo struct {
Base
}
func (Foo) Magic() { fmt.Println("foo magic") }
f := new(Foo)
f.Magic() //=> foo magic
f.MoreMagic()
The question is now what the last line f.MoreMagic() prints to the console. If inheritance were present (and hence method overwriting) it would print "foo magic foo magic". But it prints "base magic base magic". To verify this you can run this code:
http://play.golang.org/p/q52lvTFPQ6