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:
- Implementacja domyślna: Typ implementuje interfejs domyślnie, jeśli zapewnia wszystkie metody zadeklarowane w interfejsie. Nie trzeba jawnie deklarować, że typ implementuje interfejs.
- "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.
- 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. - Pusty interfejs (
interface{}lubany): 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).