Hi, thanks for posting this! > *Is `defer check f.Close()` valid?* *No, because the defer stack would run after the final handle block.*
*I describe handlers within the defer stack in Requirements to Consider for Go 2 Error Handling* *https://gist.github.com/networkimprov/961c9caa2631ad3b95413f7d44a2c98a* If you have time, could you link this post from the feedback wikis for each draft design? This post: https://groups.google.com/d/topic/golang-nuts/3A_MpcNKg7k/discussion The feedback wikis are accessible here: https://go.googlesource.com/proposal/+/master/design/go2draft.md Thanks! On Wednesday, October 17, 2018 at 3:13:20 PM UTC-7, Aditya Mukerjee wrote: > > Recently, several developers at Stripe <https://stripe.com/> who write Go > regularly for their work met to discuss the Go 2 design drafts for error > handling, error values, and generics. The goal of the meeting was *not* > necessarily > to provide a single conclusion on each of the design drafts, but rather to > collect perspectives and opinions from various Go developers at Stripe to > share more broadly. I took notes notes on the discussion; the raw and > unfiltered notes are below, and I've put a short summary at the top. > > As a preface: > > * About ten people were present > * Not all Go developers at Stripe were present; this was a group of people > who are particularly passionate about Go (and happened to be available) > * I attempted to take direct quotations as much as possible (even if the > comments were blunt at times) > > > These notes do not reflect my personal opinions on the design drafts; they > are a compilation of different perspectives that other people shared during > the meeting, and which I am relaying. However, if you have questions about > any of the points that people raised, I'm happy to elaborate to the best of > my memory. > > > *Overview* > > > *People were happy to see that check/handle was not a Java-like exception > construct, which brings too much baggage from other languages. However, > they found the control flow to be confusion, and were skeptical of whether > there were enough workflows that benefited from the change to justify the > added complexity. There was one workflow which was a notable exception: the > check/handle construct would facilitate the pattern of “if there is any > error of a certain type, perform cleanup actions”.Error values were > generally received positively, with the main questions being around how > this would intersect with pkg/errors. There were a number of fans of > pkg/errors (one person said “pkg/errors solved contextual information in > error handling for me”). Since the error values draft is philosophically > similar to pkg/errors, this was generally a positive piece of feedback, > aside from questions about how a migration would work.* > > *The design draft on generics generated the most confusion and the > sharpest feedback. People were overall happy with the goal of being able to > use complex data structures that others write, instead of reimplementing > them ourselves. However, they were not sold on the use of contracts to > achieve that goal. The syntax was controversial, and so were the semantics: > people pointed out that it was confusing to reason about the implications > of even seemingly-simple contracts (such as the Apply) example.* > > *Raw notes* > > > > > > > > > > > > *Error Handling: - How does the control flow look?- “Took me a while to > get it, but it seems kind of reasonable. But it’s pretty hard to explain up > front”- “I’m concerned that it’s hard to figure out - it’s no longer ‘going > forward’ through the function, but now jumping around in strange ways”- > “One tenet of Go has always been its readability, and you could always read > top to bottom within a package. The fact that you jump around between > handle blocks until one of them happens to return is strange”- “The > canonical example in the design draft - even that one you have to read a > few times to realize that it goes from a lower-defined handle block up to a > previously-defined one”- “What happens if none of the handle blocks return? > It’s not clear to me”- “Inner to outer, then up, then back”- “It’s about as > difficult to explain as defer, but the intersection of both is weird”- “In > small functions, it probably would scan better to have the if-check, rather > than the check-handle”- “It is designed to remove boilerplate, but it > introduces complexity. This was not originally something I found painful to > deal with in the language. It feels like a solution without a problem”- > “Now my snippet for expanding if err != nil will have to expand to “handle > err { return err }”, but otherwise it won’t add anything for me”- “Is > `defer check f.Close()` valid? If so, this would make a huge help for us in > <name of service>”- “If any error of a certain type, clean everything up” - > this makes that easier” (example code: > https://gist.github.com/ChimeraCoder/9fdef30e84ab374b612533ae4fd06873 > <https://gist.github.com/ChimeraCoder/9fdef30e84ab374b612533ae4fd06873>)- > For error handling: I really like the `check` nomenclature, rather than the > other suggestion of `try`. As a recovering Java programmer, I feel like > `try` brings in too much baggage from that language family, and leads folks > to start "thinking in exceptions" rather than adapting to Go's error > handling concepts.Error values: - “This sounds like the `failure` library > in Rust [which may be a good thing, but is definitely an improvement over > the status quo”- Look at the new errors proposal for Rust, which is > considering putting the entire stacktrace on the error itself (controlled > by an environment variable)- “pkg/errors solved contextual information in > error handling for me”- What happens if you wrap a lot of errors with > `fmt.Errorf`?Generics: - “I’m +1 on having complicated data structures > implemented by others so I don’t have to, but I’m not sure about the > contract syntax”- “If I created a contract that essentially is powerful > enough to say ‘this type must be higher-kinded’, how does the compiler know > that that contract is undecidable?”- “This reeks of the situation with the > alias proposals, where as soon as it was released into the wild, people > discovered ways to write nonsensical aliases with it, and that’s why the > final version took out the values portion (leaving only type aliases)”- > “This feels half-baked”- “I’m even a Lisper, but why do we want everything > to be in more parenthesized groups?”- “I’m in favor of stronger type > systems, and Go’s type system is not particularly sound as it is. But I’m > not sure contracts meaningfully moves the needle in one direction or the > other in terms of making things better or worse vs. keeping things the > same”- “The Apply() example is awkward syntax, and also really > non-obvious”: > https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md > <https://go.googlesource.com/proposal/+/master/design/go2draft-contracts.md>* > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.