Go Best Practices - Riešenie problémov

Toto je prvý článok zo série lekcií, ktoré som sa naučil počas niekoľkých rokov, ktoré som pracoval s výrobou Go. Prevádzkujeme veľké množstvo služieb Go vo výrobe v spoločnosti Saltside Technologies (psst, najímam viac pozícií v spoločnosti Bangalore pre spoločnosť Saltside) a prevádzkujem tiež svoju vlastnú firmu, v ktorej je spoločnosť Go neoddeliteľnou súčasťou.

Budeme sa venovať širokej škále tém, veľkých aj malých.

Prvým predmetom, ktorý som chcel v tejto sérii pokryť, je spracovanie chýb. Pre nových vývojárov Go to často spôsobuje zmätok a nepríjemnosť.

Niektoré pozadie - Chybové rozhranie

Len tak sme na tej istej stránke. Ako možno viete, chyba v Go je jednoducho čokoľvek, čo implementuje chybové rozhranie. Takto vyzerá definícia rozhrania:

napíšte chybové rozhranie {
    Chybový reťazec ()
}

Čokoľvek, čo implementuje metódu Error (), možno použiť ako chybu.

Kontrola chýb

Použitie chybových štruktúr a kontrola typu

Keď som začal písať program Go, často som porovnával chybové hlásenia, aby som zistil, aký typ chyby bol (áno, trápne myslieť, ale niekedy sa musíte obzerať, aby ste sa mohli posunúť vpred).

Lepším prístupom je použitie typov chýb. Takže môžete (samozrejme) vytvárať štruktúry, ktoré implementujú rozhranie chýb a potom porovnávať typy v príkazoch switch.

Tu je príklad implementácie chýb.

typ ErrZeroDivision struct {
    reťazec správy
}
func NewErrZeroDivision (reťazec správ) * ErrZeroDivision {
    return & ErrZeroDivision {
        správa: správa,
    }
}
reťazec func (e * ErrZeroDivision) Error () {
    návrat e.message
}

Túto chybu je možné teraz použiť.

func main () {
    výsledok, chyba: = delenie (1,0, 0,0)
    ak sa mýlim! = nula {
        prepínač err. (typ) {
        prípad * ErrZeroDivision:
            fmt.Println (err.Error ())
        default:
            fmt.Println („Čo sa stalo s h *?“)
        }
    }
    fmt.Println (výsledok)
}
func divide (a, b float64) (float64, chyba) {
    ak b == 0,0 {
        návrat 0,0, NewErrZeroDivision („Nedá sa deliť nulou“)
    }
    návrat a / b, nula
}

Tu je odkaz Go Play pre úplný príklad. Všimnite si vzor chybového prepínača (typu), ktorý umožňuje kontrolovať skôr rôzne typy chýb než niečo iné (napríklad porovnávanie reťazcov alebo niečo podobné).

Použitie balíka chýb a priame porovnanie

Vyššie uvedený prístup sa môže alternatívne vyriešiť pomocou balíka chýb. Tento prístup je vhodný na kontrolu chýb v balíku, kde potrebujete rýchle zobrazenie chýb.

var errNotFound = chyby.Nový („položka sa nenašla“)
func main () {
    err: = getItem (123) // Toto by vyvolalo errNotFound
    ak sa mýlim! = nula {
        prepnúť err {
        case errNotFound:
            log.Println („Požadovaná položka sa nenašla“)
        default:
            log.Println („Vyskytla sa neznáma chyba“)
        }
    }
}

Tento prístup je menej dobrý, ak potrebujete zložitejšie chybové objekty, napr. chybové kódy atď. V takom prípade by ste mali vytvoriť svoj vlastný typ, ktorý implementuje chybové rozhranie.

Okamžité spracovanie chýb

Niekedy narazím na kód, ako je uvedený nižšie (ale zvyčajne s väčším množstvom chmýří ..):

func example1 () chyba {
    err: = call1 ()
    návrat err
}

Ide tu o to, že sa s chybou nezaoberá okamžite. Toto je krehký prístup, pretože niekto môže vložiť kód medzi err: = call1 () a návrat err, čo by narušilo zámer, pretože by to mohlo zatieniť prvú chybu. Dva alternatívne prístupy:

// Zbaliť návrat a chybu.
func example2 () chyba {
    spätné volanie1 ()
}
// Vykonajte explicitné spracovanie chýb hneď po hovore.
func example3 () chyba {
    err: = call1 ()
    ak sa mýlim! = nula {
        návrat err
    }
    návrat nula
}

Oba vyššie uvedené prístupy sú so mnou v poriadku. Dosahujú to isté, čo je; ak niekto potrebuje niečo pridať po volaní1 (), musí sa postarať o spracovanie chýb.

To je na dnes všetko

Sledujte ďalší článok o osvedčených postupoch Go Go. Buďte silní :).

func main () {
    err: = readArticle („Go Best Practices - Riešenie problémov“)
    ak sa mýlim! = nula {
        ping ( "@ sebdah")
    }
}