Osnove struktura u Go programskom jeziku
Strukture u Go (Golang) predstavljaju ključni element za kreiranje prilagođenih tipova podataka. One omogućavaju grupiranje različitih polja podataka pod jednim imenom, čineći kod organizovanijim i lakšim za održavanje.
U ovom tekstu, istražićemo osnove struktura, uključujući njihovu definiciju, deklaraciju, inicijalizaciju i upotrebu u Go programima, uz nekoliko praktičnih primera.
Krenimo!
Uvod u strukture
Struct je kolekcija različitih polja podataka, gde svako polje ima svoj definisani tip. Ove strukture su izuzetno korisne za organizaciju srodnih informacija u jedinstvene zapise. Struktura se može sastojati od ugrađenih tipova, kao i drugih struktura, što je čini prilagodljivom i moćnom alatkom za rad sa složenim podacima. Važno je napomenuti da je sama struktura korisnički definisan tip podatka.
Strukture u Go su promenljive, što znači da se njihove vrednosti mogu modifikovati tokom izvršavanja programa. Omogućavanjem da grupišemo i prosleđujemo kompleksne podatke kroz različite delove koda, strukture poboljšavaju čitljivost i modularnost koda.
Zamislite situaciju gde morate proslediti 10 parametara funkciji – to može dovesti do nepreglednog koda. Strukture rešavaju ovaj problem omogućavajući da umesto toga prosledite samo jednu strukturu koja sadrži sve potrebne informacije.
Za definisanje strukture koriste se ključne reči type i struct. Struktura je omeđena vitičastim zagradama, slično klasama u Javi, i unutar nje se definišu polja sa svojim tipovima i identifikatorima (imenima). Više detalja o implementaciji sledi u nastavku.
Ako dolazite iz objektno orijentisanog programiranja (OOP), strukturu možete zamisliti kao klasu bez koncepta nasleđivanja.
Deklarisanje struktura
Sada kada razumete šta su strukture i zašto su korisne, vreme je da naučite kako se deklarišu. Osnovni format deklaracije strukture izgleda ovako:
type ImeStrukture struct { polje1 TipPolja1 polje2 TipPolja2 }
Gde su `type` i `struct` ključne reči, a unutar strukture se nalaze definisana polja sa svojim tipovima podataka.
Pogledajmo primer:
package main import ( "fmt" ) type Korisnik struct { ime string godine int stanjeRacuna float32 } func main() { var korisnik Korisnik fmt.Println(korisnik) }
U ovom primeru, definišemo strukturu `Korisnik` sa poljima `ime`, `godine` i `stanjeRacuna`. U funkciji `main()`, deklarišemo promenljivu `korisnik` tipa `Korisnik` i ispisujemo je. Izlaz će biti nula/prazne vrednosti polja strukture jer je nismo inicijalizovali. Nulta vrednost predstavlja osnovnu, podrazumevanu vrednost svakog tipa polja.
{ 0 0}
Inicijalizacija struktura
Nakon što smo naučili kako da deklarišemo strukture, sledeći korak je da ih inicijalizujemo, odnosno dodelimo im vrednosti. Sledeći primer pokazuje kako se to radi:
package main import ( "fmt" ) type Korisnik struct { ime string godine int stanjeRacuna float32 } func main() { // Inicijalizacija sa navedenim imenima polja korisnik1 := Korisnik{ ime: "Marko", godine: 30, stanjeRacuna: 2500.0, } // Inicijalizacija bez navođenja imena polja korisnik2 := Korisnik{"Ana", 25, 3000.0} fmt.Println(korisnik1) fmt.Println(korisnik2) }
Ovaj kod demonstrira dva načina inicijalizacije struktura – sa i bez navođenja imena polja. Izlaz ovog koda će biti:
{Marko 30 2500} {Ana 25 3000}
Ako prilikom inicijalizacije ne navedemo vrednost za neko od polja, to polje će podrazumevano dobiti nultu vrednost:
korisnik1 := Korisnik{ ime: "Marko", godine: 30, } // Izlaz: {Marko 30 0.0}
Postoji još jedan način kreiranja struktura, a to je korišćenjem ključne reči `new`. U sledećem delu ćemo objasniti kako se to radi.
Pristup poljima strukture
Sada znamo kako da kreiramo i inicijalizujemo strukture. Vreme je da naučimo kako da pristupimo poljima strukture. U Go, za pristup poljima koristimo tačka operator. Nastavljajući sa prethodnim primerom, pogledajmo kako pristupamo poljima `ime` i `godine`:
package main import ( "fmt" ) type Korisnik struct { ime string godine int stanjeRacuna float32 } func main() { korisnik := Korisnik{ ime: "Marko", godine: 30, stanjeRacuna: 2500.0, } fmt.Println(korisnik.ime) fmt.Println(korisnik.godine) fmt.Println(korisnik.stanjeRacuna) }
U ovom primeru, za pristup poljima koristimo `imeStrukture.imePolja`. Izlaz ovog koda će biti:
Marko 30 2500
Kao što je ranije spomenuto, možemo kreirati strukture i pomoću ključne reči `new`. Pogledajmo kako:
korisnik := new(Korisnik) korisnik.ime = "Marko" korisnik.godine = 30 korisnik.stanjeRacuna = 2500.0 fmt.Println(korisnik) // Izlaz: &{Marko 30 2500}
Ključna reč `new` vraća pokazivač na inicijalizovanu strukturu. U Go, ne morate eksplicitno dereferencirati pokazivač, ali `fmt.Println(*korisnik)` bi dao isti izlaz.
Ugnježđene strukture
Strukture u Go mogu sadržati i druge strukture koje je definisao korisnik. To omogućava kreiranje ugnježdenih struktura:
package main import ( "fmt" ) type Korisnik struct { ime string godine int stanjeRacuna float32 detaljiUloge DetaljiUloge } type DetaljiUloge struct { pozicija string tim string } func main() { detaljiUlogeZaMarka := DetaljiUloge{ pozicija: "Softverski inženjer", tim: "Razvoj", } korisnik := Korisnik{ ime: "Marko", godine: 30, stanjeRacuna: 2500.0, detaljiUloge: detaljiUlogeZaMarka, } fmt.Println(korisnik) }
U ovom kodu, struktura `DetaljiUloge` je deo strukture `Korisnik`. Izlaz će biti:
{Marko 30 2500 {Softverski inženjer Razvoj}}
Za pristup polju pozicija u okviru ugnježdene strukture, koristimo operator tačke na sledeći način: `korisnik.detaljiUloge.pozicija`.
Poređenje struktura
Dve strukture su jednake ako su sve njihove polja, kako ona ugrađena tako i ona definisana od strane korisnika, međusobno jednaka. Važno je napomenuti da nisu svi tipovi podataka uporedivi (na primer, mape nisu direktno uporedive). Pogledajmo sledeći primer:
package main import ( "fmt" ) type Korisnik struct { ime string godine int stanjeRacuna float32 } func main() { korisnik1 := Korisnik{ ime: "Marko", godine: 30, stanjeRacuna: 2500.0, } korisnik2 := Korisnik{ ime: "Marko", godine: 30, stanjeRacuna: 2500.0, } korisnik3 := Korisnik{ ime: "Ana", godine: 25, stanjeRacuna: 3000.0, } if korisnik1 == korisnik2 { fmt.Println("korisnik1 i korisnik2 su jednaki") } else { fmt.Println("korisnik1 i korisnik2 nisu jednaki") } if korisnik1 == korisnik3 { fmt.Println("korisnik1 i korisnik3 su jednaki") } else { fmt.Println("korisnik1 i korisnik3 nisu jednaki") } }
Prazne strukture i strukture sa nultim vrednostima su jednake. Redosled polja nije važan, bitno je da se vrednosti svakog polja podudaraju za jednakost. Izlaz ovog koda će biti:
korisnik1 i korisnik2 su jednaki korisnik1 i korisnik3 nisu jednaki
Zaključak
Odlično!
Sada ste spremni da koristite strukture u Go. Prošli smo kroz sve osnove, uključujući deklaraciju, inicijalizaciju i pristup poljima strukture. Takođe smo videli kako da uporedimo dve strukture i kako da koristimo ugnježđene strukture. Evo nekoliko resursa za dalje učenje o strukturama:
Ima još mnogo toga da se nauči o strukturama, ali ovo je dobar početak. Nadamo se da ste naučili nešto novo!
Nastavite da istražujete i učite!