Marvin can probably speak more on async/awaits but it's one of the problems of doing async in typed languages, since the async type-ness contaminates all the other types it touches, so from type T you suddenly need to work with Async<T>, which is where fancy-pants things like monads come in.
I understand wanting to touch up your resume, although you can run C# and F# nowadays on Mono. Go isn't a bad choice in this regard, I just personally dislike it. It probably
will help you by exposing you to more opportunities, so it's not bad for that, I just think most companies opting to work with it are making a mistake because it's trendy.
Waitgroups are part of what makes goroutines annoying. Instead of the goroutine itself signalling via a variable it already returned that the job is done, you need to go to
another variable then wait for it. It's as bad as using
goto because you're doing one thing in one point of your program and waiting for it in a whole other place. Terrible software design.
Imagine the case where every async process returns a channel, you could wait on all processed by just:
Code:
<- merge(map(op, inputs))
But golang had to reinvent goto, and you got fucked with another argument to your function. And besides, you can't map over sequences in golang so the entire example collapses.
RE: scoping. as far as I know go has block scoping as well.
RE: one struct of multiple types. I think they made a mistake by allowing usage of the type keyword for both interface and concrete types because interfaces and types are completely different. I don't think interfaces have any runtime meaning. They just help the programmer and the compiler. So it's one
one type, which in your example satisfies one
interface.
This is what embedded structs look like in go:
Code:
type Bitmap struct{
data [4][4]bool
}
type Renderer struct{
Bitmap
on uint8
off uint8
}
I don't know about C#, but stacktraces are completely an OK way of knowing where your error comes from.