Sobes.tech
Junior

Czym są interfejsy w języku Go?

sobes.tech AI

Odpowiedź od AI

Interfejs w Go to zbiór sygnatur metodów. Określa zachowanie obiektu: co "może robić". Interfejs nie zawiera danych ani implementacji metod.

Kluczowe cechy:

  1. Implementacja domyślna: Typ implementuje interfejs domyślnie, jeśli zapewnia wszystkie metody zadeklarowane w interfejsie. Nie trzeba jawnie deklarować, że typ implementuje interfejs.
  2. "Typowanie kaczki" (Duck Typing): "Jeśli kwacze jak kaczka i chodzi jak kaczka, to jest kaczka". W Go ważny jest nie typ obiektu, lecz czy implementuje on wymagany zestaw metod.
  3. Wartość zerowa: Wartość zerowa interfejsu to nil. Wartość interfejsu może być nil, jeśli zarówno typ, jak i wartość wewnątrz niego są nil.
  4. Pusty interfejs (interface{} lub any): Może przechowywać wartość dowolnego typu. Często używany do pracy z danymi nieznanego typu lub w uniwersalnych kontenerach.

Przykład definicji i użycia:

// Definiujemy interfejs Greeter
type Greeter interface {
	Greet() string // Metoda Greet zwracająca łańcuch znaków
}

// Definiujemy typ Person
type Person struct {
	Name string
}

// Person implementuje interfejs Greeter, dostarczając metodę Greet
func (p Person) Greet() string {
	return "Cześć, " + p.Name
}

// Definiujemy typ Robot
type Robot struct {
	Model string
}

// Robot również implementuje interfejs Greeter
func (r Robot) Greet() string {
	return "Witaj, model " + r.Model
}

// Funkcja przyjmuje interfejs Greeter
func SayHello(g Greeter) {
	fmt.Println(g.Greet()) // Wywołujemy metodę Greet przez interfejs
}

func main() {
	person := Person{Name: "Alicja"}
	robot := Robot{Model: "RX-800"}

	SayHello(person) // Przekazujemy Person, który implementuje Greeter
	SayHello(robot)  // Przekazujemy Robot, który implementuje Greeter
}

Interfejsy sprzyjają elastycznemu i luźno powiązanemu projektowi, umożliwiając pisanie funkcji, które działają z różnymi typami danych, pod warunkiem że te typy implementują wymaganą interfejs. Są używane do tworzenia kodu ogólnego i w standardowej bibliotece Go (np. io.Reader, io.Writer, fmt.Stringer).