Sobes.tech
Middle

Kaip įgyvendinamos objektinio programavimo (OOP) koncepcijos Go kalboje?

sobes.tech AI

Atsakymas iš AI

Go neturi klasikinių koncepcijų, būdingų kitiems kalboms (Java, C++) – klasių, paveldėjimo ir virtualių metodų. Objektinio programavimo realizacija vyksta per:

  • Struktūras (Structs): Apjungia duomenis (stulpelius).
    type Person struct {
    	Name string
    	Age  int
    }
    
  • Metodus: Funkcijos su susietu priėmėju (struktūra ar kita tipu). Leidžia struktūroms turėti elgseną.
    func (p Person) Greet() string {
    	return "Hello, my name is " + p.Name
    }
    
    • Priėmėjas pagal reikšmę: Metodas veikia su kopija struktūros. Pakeitimai metodo viduje neįtakoja originalios struktūros.
    • Priėmėjas pagal nuorodą: Metodas veikia su originalia struktūra per nuorodą. Pakeitimai metodo viduje įtakoja originalią struktūrą.
  • Sąsajos (Interfaces): Apibrėžia metodų parašus, kuriems turi atitikti tipas. Užtikrina polimorfizmą "paukščio tipą" (duck typing). Tipas neįvardytai įgyvendina sąsają, jei įgyvendina visas jos metodus.
    type Greeter interface {
    	Greet() string
    }
    
    func SayHello(g Greeter) string {
    	return g.Greet()
    }
    
  • Įdėjimas (Embedding): Leidžia vienai struktūrai "įdėti" kitą struktūrą ar sąsają. Tai nėra klasikinis paveldėjimas, o kompozicija. Įdėta struktūra tampa anonimine lauku, prie kurio galima tiesiogiai prieiti per įdėtos struktūros egzempliorių.
    type Employee struct {
    	Person // įdėta struktūra
    	ID string
    }
    
    // Employee dabar turi laukus Name ir Age, taip pat metodą Greet()
    
    e := Employee{
    	Person: Person{Name: "Alice", Age: 30},
    	ID:     "E123",
    }
    fmt.Println(e.Greet()) // kviečia Person struktūros Greet() metodą per Employee
    
Objektinio programavimo koncepcija Įgyvendinimas Go Pastabos
Klasės Struktūros Nėra aiškios raktažodžio class
Užrakto (inkapsuliacijos) principas Eksportuojami (didžiosiomis raidėmis) / Neeksportuojami (mažosiomis raidėmis) laukai/metodai Valdymas matomumo lygyje pakete
Paveldėjimas Įdėjimas (Embedding) Kompozicija vietoj hierarchinio paveldėjimo
Polimorfizmas Sąsajos (Interfaces) Duck typing, neaiški sąsajų įgyvendinimas