errors (langChange)

198 views
Skip to first unread message

Matthias Mädel

unread,
Apr 13, 2022, 5:44:06 PM4/13/22
to golang-nuts
Hello 

Please some advice if something like the following could be helpful and if it is possible to implement with the compiler.

Thank You

func Experimental(src, dst string) error {

    //goto is blocked with err == nil
    goto r, err := os.Open(src)
    defer r.Close()
    goto w, err := os.Create(dst)
    goto v, err := io.Copy(w, r)
    goto err := w.Close()
    return nil

    //alternative
    goto err {
    r, err := os.Open(src)
    defer r.Close()
    w, err := os.Create(dst)
    v, err := io.Copy(w, r)
    err := w.Close()
    return nil
    }

    return err:
        w.Close()
        os.Remove(dst)
        fmt.Errorf("copy %s %s: %v", src, dst, err)

}

Ian Lance Taylor

unread,
Apr 13, 2022, 6:04:22 PM4/13/22
to Matthias Mädel, golang-nuts

Matthias Mädel

unread,
Apr 14, 2022, 5:05:15 AM4/14/22
to golang-nuts
some refining...

func Experimental(src, dst string) error {

    //goto jumps to "label" if present; selects values right to left; is ignored with value´s zero value
    goto r, err := os.Open(src)
    defer r.Close()
    goto w, err := os.Create(dst)
    defer w.Close()
    goto v, err := io.Copy(w, r)
    goto err := w.Close()

    //new: a "label" is a block also holding pointer to the actual value
v:  {
    //do something with value here...
    //return error
    }

err:{
    defer os.Remove(dst)
    return fmt.Errorf("copy %s %s: %v", src, dst, err)
    }

    return nil

}

Matthias Mädel

unread,
Apr 14, 2022, 12:15:35 PM4/14/22
to golang-nuts
following simulates some functionality

package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

func GOTO(f *os.File, e error) (*os.File, error) { return f, e }
func COPYGOTO(i int64, e error) (int64, error)   { return i, e }

var err error
var r, w *os.File

func main() {

    log.Println(Experimental("test.txt", "text.txt"))

}

func Experimental(src, dst string) error {

    //goto jumps to "label" if present; selects values right to left; is ignored with value´s zero value

    r, err = GOTO(os.Open(src))
    if err != nil {
        goto err
    }
    defer r.Close()

    w, err = GOTO(os.Create(dst))
    if err != nil {
        goto err
    }
    defer w.Close()

    _, err = COPYGOTO(io.Copy(w, r))
    if err != nil {
        goto err
    }

    err = w.Close()
    if err != nil {
        goto err
    }

    return nil

err:
    defer os.Remove(dst)
    return fmt.Errorf("copy %s %s: %v", src, dst, err)

}
Reply all
Reply to author
Forward
0 new messages