On Friday, November 12, 2021 at 6:29:46 PM UTC-5 michael...@gmail.com wrote:
> FWIW (which may not be much) I've settled on explicitly naming my return > values in the function declaration. If the function returns include an > error, I name always name it err. The general pattern is > > func foo() (v someType, err error) { > err = doSomething() > if err != nil { > err = fmt.Errorf("some context: %v", err) > return > } > err = doNextThing() > if err != nil { > err = fmt.Errorf("some context: %v", err) > return > } > // etc > return > } > > As Brian mentioned above, naked return values are generally frowned upon. You can easily find the arguments if you like, but even the official tour of go (at https://tour.golang.org/basics/7) says: "Naked return statements should be used only in short functions, as with the example shown here. They can harm readability in longer functions." That's a pretty official caution. Personally, I am very much in that camp. In my experience, naked returns harm readability in all cases, just less in short functions. So this is probably not a good pattern to use as your default one. > Naming the error solves the initial := problem. As for shadowing, I make > it a point never to do a := assignment involving err. For example, if I > need to call os.Open, I do > > var f *os.File > f, err = os.Open(...) > > I tend to use other names for errors only when it's something I can fix > within the local scope. > > At first I tried hard to avoid the verbosity. Now I use a few helpful > snippets to reduce keystrokes and an editor plugin the partially fades any > block that starts with "if err != nil". The latter works amazingly well > (for me at least) to reduce visual clutter. I like it much better than one > I tried that auto-folds error blocks. It made me waste time unfolding them > to see what was inside :-) > > YMMV, of course. > > On Friday, November 12, 2021 at 11:15:21 AM UTC-5 david....@gmail.com > wrote: > >> On Fri, Nov 12, 2021 at 7:48 AM Miguel Angel Rivera Notararigo < >> ntr...@gmail.com> wrote: >> >>> I tend to use errX (X is adapted according to context) for function >>> scoped errors, and err for block scoped errors >>> >>> func MyFunc() error { >>>> v, errDS := doSomething() >>>> ... >>>> errDA := doAnotherthing() >>>> } >>>> >>> >>> if err := doAnotherthing(); err != nil { >>>> return err >>>> } >>>> >>> >>> That way you don't shadow errors. >>> >> >> >> I can't +1 this enough. >> >> I've caught *so* many bugs from shadowed errors (and re-used error >> variables). I consider it a rather bad anti-pattern to have a single err >> variable >> that's reused throughout a scope. >> If you have unique error variable names and you forget to do something >> with an error that you've assigned a name you automatically get unused >> variable compile-errors. (just this is enough to be worthwhile) >> >> >> With that said, constraining the scope using the initializer statement on >> an if (or switch) statement suffices when you don't need any other return >> values, at which point I may use the err variable-name (although I often >> make those unique for clarity anyway). >> >>> -- >>> 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...@googlegroups.com. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/CAF9DLCmR4ZdnVs4A28BSrPcbiHsQ_ufub5cSPjCt2SDy2dA1xA%40mail.gmail.com >>> >>> <https://groups.google.com/d/msgid/golang-nuts/CAF9DLCmR4ZdnVs4A28BSrPcbiHsQ_ufub5cSPjCt2SDy2dA1xA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- 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. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/9789bfb1-1944-4874-b7c6-785e16002been%40googlegroups.com.