Грађевине у Голангу

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!