Sobes.tech
Middle

Jak w języku Go realizowane są koncepcje programowania obiektowego (OOP)?

sobes.tech AI

Odpowiedź od AI

W Go nie ma klasycznych koncepcji klas, dziedziczenia i metod wirtualnych, które są powszechne w innych językach (Java, C++). Programowanie obiektowe realizuje się za pomocą:

  • Struktury (Structs): Grupują dane (pola).
    type Person struct {
    	Name string
    	Age  int
    }
    
  • Metody: Funkcje z powiązanym odbiorcą (struktura lub inny typ). Pozwalają na dodanie zachowania do struktur.
    func (p Person) Greet() string {
    	return "Hello, my name is " + p.Name
    }
    
    • Odbiorca przez wartość: Metoda działa na kopii struktury. Zmiany w metodzie nie wpływają na oryginalną strukturę.
    • Odbiorca przez wskaźnik: Metoda działa na oryginalnej strukturze przez wskaźnik. Zmiany w metodzie wpływają na oryginalną strukturę.
  • Interfejsy: Definiują zestaw sygnatur metod, które musi spełniać typ. Zapewniają polimorfizm "po typowaniu kaczki" (duck typing). Typ implementuje interfejs niejawnie, jeśli implementuje wszystkie jego metody.
    type Greeter interface {
    	Greet() string
    }
    
    func SayHello(g Greeter) string {
    	return g.Greet()
    }
    
  • Wbudowywanie (Embedding): Pozwala jednej strukturze "wbudować" inną strukturę lub interfejs. To nie jest dziedziczenie w klasycznym sensie, lecz kompozycja. Wbudowana struktura staje się anonimowym polem, do którego można odwołać się bezpośrednio przez instancję struktury wbudowującej.
    type Employee struct {
    	Person // wbudowana struktura
    	ID string
    }
    
    // Employee ma teraz pola Name i Age, a także metodę Greet()
    
    e := Employee{
    	Person: Person{Name: "Alice", Age: 30},
    	ID:     "E123",
    }
    fmt.Println(e.Greet()) // wywołanie metody Greet() struktury Person przez Employee
    
Koncepcja OOP Implementacja w Go Uwagi
Klasy Struktury Nie ma jawnego słowa kluczowego class
Hermetyzacja Eksportowane (z wielką literą) / nieeksportowane (z małą literą) pola/metody Kontrola widoczności na poziomie pakietu
Dziedziczenie Wbudowywanie (Embedding) Kompozycja zamiast hierarchicznego dziedziczenia
Polimorfizm Interfejsy Duck typing, niejawna implementacja interfejsów