struct yra sudėtinis tipas, kuris sujungia susijusius laukus — Go būdas apibrėžti pasirinktinio tipo duomenis ir modeliuoti objektus. Kadangi Go neturi klasių, struct'ai (ir metodai) yra tas, kaip Go atlieka objektiškai orientuotą programavimą.
Struct'o apibrėžimas ir naudojimas
type Person struct {
Name string // exported (capitalized) → accessible from other packages
Age int
email string // unexported (lowercase) → package-private
}
// creating instances
p1 := Person{Name: "Ann", Age: 30} // named fields (preferred — clear, order-independent)
p2 := Person{"Bob", 25, "[email protected]"} // positional (fragile — order matters)
var p3 Person // zero value: {"", 0, ""}
p1.Name // access fields with dot notation
p1.Age = 31 // mutate
Laukų matomumas per didžiąsias raides
Capitalized field/type/func name → EXPORTED (public, usable outside the package)
lowercase name → unexported (private to the package)
Go naudoja didžiąsias raides, o ne raktažodžius, matomumui — tai charakteringa Go konvencija.
Metodai struct'uose (Go OOP)
// a method is a function with a RECEIVER (the struct it operates on)
func (p Person) Greet() string { // value receiver
return "Hi, I'm " + p.Name
}
func (p *Person) Birthday() { // pointer receiver — can MODIFY the struct
p.Age++
}
p1.Greet() // "Hi, I'm Ann"
p1.Birthday() // modifies p1 (Go auto-takes the address)
Metodai priskiria elgesį struct'ams per receiver. Rodyklės receiver'iai (*Person) leidžia metodams keisti struct'ą; reikšmės receiver'iai gauna kopiją.
Struct'ai yra reikšmės tipai
p1 := Person{Name: "Ann"}
p2 := p1 // COPIES the entire struct (independent)
p2.Name = "Bob"
fmt.Println(p1.Name) // "Ann" — unchanged (it was a copy)
// pass a pointer to share/modify
func update(p *Person) { p.Name = "X" }
Struct'o priskyrimas arba perdavimas jį kopijuoja (reikšmės semantika) — norėdami dalintis arba keisti, naudokite rodyklę.
Struct'o žymos (metaduomenys)
type User struct {
Name string `json:"name"` // tags guide encoding/decoding
Email string `json:"email,omitempty"`
}
Žymos priskiria metaduomenis (naudojamus JSON, DB, validavimo bibliotekose), perskaitytus per reflection.
Kodėl tai svarbu
Struct'ai yra pagrindinis būdas modeliuoti duomenis ir kurti pasirintinių tipų Go kalba — ir sujungus su metodais, tai yra Go objektiškai orientuoto programavimo būdas (jis neturi klasių).
Suprasti struct'o apibrėžimą, didžiosiomis raidėmis pagrįstą matomumo konvenciją (unikali Go), reikšmės semantiką (priskyrimas kopijuoja — todėl naudokite rodyklę dalintis/keisti, daži klaida), metodus su reikšmės ir rodyklės receiver'iais bei struct'o žymas (JSON/DB kartojimui) yra pagrindinis beveik viso Go kodo žinojimas.
Struct'ai pasirodo visur — domenės modeliai, konfigūracija, API naudai, duomenų struktūros — todėl jie yra būtinas, kasdienis žinojimas efektyviam darbui su Go.
