Sobes.tech
Middle

Ako sú v jazyku Go realizované koncepty objektovo orientovaného programovania (OOP)?

sobes.tech AI

Odpoveď od AI

V Go chýbajú klasické koncepty tried, dedičstva a virtuálnych metód, ktoré sú charakteristické pre iné jazyky (Java, C++). Objektovo orientované programovanie je realizované cez:

  • Štruktúry (Structs): Zoskupujú údaje (polia).
    type Person struct {
    	Name string
    	Age  int
    }
    
  • Metódy: Funkcie s asociovaným príjemcom (štruktúrou alebo iným typom). Umožňujú štruktúram mať správanie.
    func (p Person) Greet() string {
    	return "Hello, my name is " + p.Name
    }
    
    • Príjemca podľa hodnoty: Metóda pracuje s kópiou štruktúry. Zmeny vnútri metódy neovplyvňujú originálnu štruktúru.
    • Príjemca podľa ukazovateľa: Metóda pracuje s originálnou štruktúrou cez ukazovateľ. Zmeny vnútri metódy ovplyvňujú originálnu štruktúru.
  • Rozhrania (Interfaces): Definujú súbor signatúr metód, ktorým musí zodpovedať typ. Zabezpečujú polymorfizmus "podľa kačice" (duck typing). Typ implicitne implementuje rozhranie, ak implementuje všetky jeho metódy.
    type Greeter interface {
    	Greet() string
    }
    
    func SayHello(g Greeter) string {
    	return g.Greet()
    }
    
  • Vloženie (Embedding): Umožňuje jednej štruktúre "vložiť" inú štruktúru alebo rozhranie. Nie je to dedičstvo v klasickom zmysle, skôr kompozícia. Vložená štruktúra sa stáva anonymným poľom, ku ktorému sa dá priamo odkazovať cez inštanciu vkladajúcej štruktúry.
    type Employee struct {
    	Person // vložená štruktúra Person
    	ID string
    }
    
    // Employee teraz má polia Name a Age, ako aj metódu Greet()
    
    e := Employee{
    	Person: Person{Name: "Alice", Age: 30},
    	ID:     "E123",
    }
    fmt.Println(e.Greet()) // volanie metódy Greet() štruktúry Person cez Employee
    
Koncepcia OO Implementácia v Go Poznámky
Triedy Štruktúry Nie je jasné kľúčové slovo class
Zapuzdrovanie Exportovateľné (s veľkým písmenom) / Neexportovateľné (s malým písmenom) polia/metódy Riadenie viditeľnosti na úrovni balíka
Dedičstvo Vloženie (Embedding) Kompozícia namiesto hierarchického dedičstva
Polymorfizmus Rozhrania Duck typing, nejasná implementácia rozhraní