Set Error as return value by default from function
<https://go.googlesource.com/proposal/+/refs/heads/master/go2-language-changes.md#go-2-language-change-template> Go 2 language change template: I am a novice Go programmer. I have also some experience with JS, Java, SQL. These changes simplifies working with error, do cleaner code and allows to not remember to pass the error up the stack. I don't find idea one like it from proposed before. This proposal is without implementation. Orthogonality: how does this change interact or overlap with existing features? - complements existing. Is the goal of this change a performance improvement? - for developers. What quantifiable improvement should we expect? - Reduce work with errors only to determine the place of their processing. Does this affect error handling? - Yes. How does this differ from previous error handling proposals? - complements the existing implementation of functions. Is this about generics? - No. In "What to avoid": Other languages have not it. My proposal states a idea rather than a solution. Idea All functions can be return Error by default. Its mean that all functions always return error = nil and if catch, than error != nil. In the place where error handling is required, then call the handling function (handling() or ifError() or checkError() or someNameFunctionErrorHandling() and etc.), here let it be checkError(). Overview func anyFunc() error {var err error; return err} == func anyFunc() {} so then main() | ˅ func() // if need error processing - "Any Error" | ^ ˅ | func() // default forwarding error | ^ ˅ | func() // getting an error - "Any Error" Please see examples for understanding. Examples Example 1 Old func doAny() (int, error) { if true{ // simulate getting an error return 0, Errors.New("Any Error") } return 1, nil } main() { _, err := doAny() if err != nil { // error processing fmt.Println(err) // "Any Error" } } New (at first glance, in the simple case, almost nothing has changed) func doAny() int { if true{ // simulate getting an error return Errors.New("Any Error"), 0 // allways error is the first returned value } return 1 } main() { i := doAny() checkError() { // error processing fmt.Println(err) // "Any Error" } } Example 2 Old func doAny() (int, error) { if true{ // simulate getting an error return 0, Errors.New("First Error") } return 1, nil } main() {defer func() { if err != nil { // last error processing fmt.Println(err) // "Second Error" } }() _, err := doAny() if err != nil { // current error processing from doAny() fmt.Println(err) // "First Error" err = Errors.New("Second Error") } } New (we are able to immediately process the first error encountered) func doAny() int { if true{ // simulate getting an error return Errors.New("First Error"), 0 } return 1 } main() { checkError() { // first error processing fmt.Println(err) // "First Error" } defer checkError() { // last error processing fmt.Println(err) // "Second Error" } i := doAny() checkError() { // current error processing from doAny() fmt.Println(err) // "First Error" } err = Errors.New("Second Error") } Example 3 Old func doAny() (int, error) { if true{ // simulate getting an error return 0, Errors.New("Any Error") } return 1, nil } func doNext() error { ... _, err := doAny() if err != nil { return err } return nil } main() { err := doNext() if err != nil { // error processing fmt.Println(err) // "Any Error" } } New (we can forget to forward the error, but not here) func doAny() int { if true{ // simulate getting an error return Errors.New("Any Error"), 0 } return 1 } func doNext() { ... doAny() } // just forwarding last error main() { _ = doNext() checkError() { // error processing fmt.Println(err) // "Any Error" err = nil // and can forwarding nil as error } } Thank you. -- 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/68ce2a90-8f30-4141-bb15-67d793b21b95o%40googlegroups.com.