Klaida — ne sprogimas, o reikšmė
Failai — pirmoji vieta, kur programa susiduria su išoriniu pasauliu. O išorinis pasaulis nepatikimas: failo gali nebūti, diskas gali būti pilnas, teisės gali neleisti. Todėl Go čia visur taiko taisyklę, kurią jau pažįsti iš strconv.Atoi:
data, err := os.ReadFile("items.json")
if err != nil {
// kas nors nepavyko — REAGUOJAM čia
}
Klaida Go kalboje — ne sprogimas, o paprasta grąžinama reikšmė. Funkcija nesugriauna programos; ji ramiai pasako „nepavyko, štai kodėl" ir palieka sprendimą tau. Kiekviena failo operacija grąžina error, ir kiekvieną privalai patikrinti.
Žemiausiame lygyje failas gyvena tris žingsnius: atidaryk → naudok → uždaryk. Atidarytas failas — užimtas resursas, todėl Go turi defer — „padaryk, kai funkcija baigsis, kad ir kas nutiktų":
f, err := os.Create("items.json")
if err != nil {
return err
}
defer f.Close() // uždarymas užsakytas IŠ KARTO po atidarymo
Spąstai. Dvi nuodėmės, kurios „veikia" tavo kompiuteryje ir sugriauna programą pas kitus:
- Ignoruoti klaidą:
data, _ := os.ReadFile(...)— failo nėra,datatuščias, o programa toliau apsimeta, kad viskas gerai, ir lūžta vėliau, toli nuo tikrosios priežasties. Klaidą tikrink ten, kur ji gimsta.- Pamiršti
defer f.Close(): neuždarytas failas — dar neįrašyti duomenys gali likti buferyje (failas lieka tuščias ar pusinis), o operacinė sistema laiko failą užimtą. Įprotis: parašeios.Createaros.Open— kita eilutė po klaidos patikros yradefer f.Close().
Gera žinia: kitame žingsnyje pamatysi, kad kasdieniam darbui Go duoda porą funkcijų, kurios atidarymą ir uždarymą sutvarko už tave — bet error patikra lieka TAVO darbas visada.