In Go returning an error implies that the caller will need to add 3 lines of the source for each call to propagate the error. This is really ugly. Rust managed to reduce that source overhead down to the single extra ? character while keeping all the benefits of explicit error handling. I wish Go gets something similar.
Being explicit is a double edge sword. It requires more typing, but there's also no don't about what the code is doing.
Whether the bit of source is a single character or a paragraph of prose is about verbosity rather than explicitness as long as the behaviour under discussion is caused by a piece of source with precisely that purpose.
if f, err := os.Open(path); err != nil {
return nil, fmt.Errorf("could not open path: %v", err)
}
This is the vast majority of my error management code in go. Is rust less verbose in this regard? AFAIK, the question mark operator is equivalent to `if err != nil { return nil, err }`.1. Define a conversion between the two errors that adds the context.
2. Use .map_err() at the callsite to do the transformation there.
Evolution of Go (Griesemer, GopherCon 2015)
Video: https://www.youtube.com/watch?v=0ReKdcpNyQg
Slides: https://talks.golang.org/2015/gophercon-goevolution.slide
Origins of Go Concurrency (Rob Pike, OSCON 2010)
Video: https://www.youtube.com/watch?v=3DtUzH3zoFo
Slides: http://go-lang.cat-v.org/talks/slides/emerging-languages-cam...
You can also write it Go style if you prefer; we started off with exactly that, then moved to a macro, then turned that macro into ?.
That all being said, none of that feels very Go-like, so it makes sense that they haven’t followed what we did.
If you're only familiar with macros from C or C++ take a look. The basic idea is that your macro fictions don't use input text and output text. Instead they accept an Abstract Syntax Tree and return a known AS THE. That way the expansion plays well with the grammer.
It also manages separate variable scopes well. You only get bleed if you want it.
I used to shudder at the thought of macros but I'm convinced. Java or Go could use them reasonably I think.
I'm not a rust programer so my understand is probably a little wrong. I'm not intimately familiar with all of the details. Correct me if I'm mistaken!
Interesting. Does the Rust book (you wrote), explain the difference between the Go style and the current Rust style, and explain how to use the Rust style (well)?
Asking because I've found this Some / None stuff (also there in other languages like F#) a little tricky to understand (although I have not spent a lot of time on it yet).