Hlavní navigace

Názor k článku Go: minimalistický a překvapivě výkonný programovací jazyk od stilett - Problém s vaším příkladem je, že jste zkopíroval...

Článek je starý, nové názory již nelze přidávat.

  • 20. 11. 2018 20:39

    stilett (neregistrovaný) ---.sychrovnet.cz

    Problém s vaším příkladem je, že jste zkopíroval protipříklad :-)
    Korektní řešení je totiž:

    func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
    return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
    return
    }
    defer dst.Close()

    return io.Copy(dst, src)
    }

    V jazyce s výjimkami byste to musel korektně napsat nějak takto (příklad je v pseudojazyce):

    func CopyFile(dstName, srcName string) int64 throws FileException {
    src := os.Open(srcName)
    try {
    dst := os.Create(dstName)
    try {
    return io.Copy(dst, src)
    } finally {
    dst.Close()
    }
    } finally {
    src.Close()
    }
    }

    nebo

    func CopyFile(dstName, srcName string) int64 throws FileException {
    var src *os.File
    var dst *os.File

    try {
    src = os.Open(srcName)
    dst = os.Create(dstName)
    return io.Copy(dst, src)
    } finally {
    if dst != nil {
    dst.Close()
    }

    if src != nil {
    src.Close()
    }
    }
    }

    Což bych se zdráhal označit za elegantnější řešení.

    Samozřejmě lze nalézt příklady, kde budou výjimky výrazně elegantnější. Ale stejně tak lze najít příklady, kde to je opačně.