Ein Interface implementieren
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 14 von 68.
Nachdem Sie nun wissen, wie man ein Interface definiert, lassen Sie uns lernen, wie Go-Typen diese tatsächlich implementieren. Das Wichtigste, was es zu verstehen gilt, ist, dass Go eine implizite Implementierung verwendet – es ist kein spezielles Schlüsselwort oder eine Deklaration erforderlich.
Wenn ein Typ alle Methoden besitzt, die ein Interface erfordert, erfüllt er dieses Interface automatisch. Sie müssen nicht explizit angeben, dass Ihr Typ das Interface implementiert – Go findet das für Sie heraus.
So funktioniert es mit dem Shaper-Interface aus der vorherigen Lektion:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Da der Typ Circle über eine Methode Area() verfügt, die einen float64 zurückgibt, implementiert er automatisch das Interface Shaper. Es ist nicht notwendig, diese Beziehung explizit zu deklarieren – Go erkennt sie anhand der Übereinstimmung der Methodensignatur.
Dieser implizite Ansatz macht Go-Interfaces unglaublich flexibel. Jeder bestehende Typ kann ein neues Interface erfüllen, solange er über die erforderlichen Methoden verfügt, selbst wenn das Interface erst nach dem Schreiben des Typs erstellt wurde.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachIn dieser Herausforderung üben Sie die Implementierung eines Interfaces, indem Sie ein einfaches Fahrzeugsystem erstellen. Sie erstellen ein Car-Struct, das automatisch ein Vehicle-Interface durch die implizite Implementierung von Go implementiert.
Sie erhalten zwei Eingaben:
- Einen String, der die Marke des Autos darstellt (z. B.
"Toyota") - Einen String, der die Geschwindigkeit des Autos in km/h darstellt (z. B.
"120")
Ihre Aufgabe ist es:
- Definieren Sie ein
Vehicle-Interface mit einer Methodensignatur:GetInfo(), die einen String zurückgibt - Definieren Sie ein
Car-Struct mit zwei Feldern:Brand(string) undSpeed(int) - Implementieren Sie die
GetInfo()-Methode für dasCar-Struct, die einen String im Format"Brand: [brand], Speed: [speed] km/h"zurückgibt - Parsen Sie die Eingaben, um eine
Car-Instanz zu erstellen - Rufen Sie die
GetInfo()-Methode auf und geben Sie das Ergebnis aus
Denken Sie daran, dass in Go das Car-Struct automatisch das Vehicle-Interface implementiert, da es über die erforderliche GetInfo()-Methode mit der korrekten Signatur verfügt. Es ist nicht erforderlich, explizit zu deklarieren, dass Car das Vehicle-Interface implementiert – Go erkennt diese Beziehung implizit.
Spickzettel
Go verwendet eine implizite Implementierung für Interfaces – es ist kein spezielles Schlüsselwort oder eine Deklaration erforderlich.
Wenn ein Typ über alle Methoden verfügt, die ein Interface erfordert, erfüllt er dieses Interface automatisch:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}Da Circle über eine Methode Area() verfügt, die einen float64 zurückgibt, implementiert er automatisch das Shaper-Interface ohne explizite Deklaration.
Dieser implizite Ansatz macht Go-Interfaces flexibel – jeder bestehende Typ kann ein neues Interface erfüllen, solange er über die erforderlichen Methoden verfügt, selbst wenn das Interface erst nach dem Typ erstellt wurde.
Probier es selbst
package main
import (
"fmt"
"strconv"
)
// TODO: 1. Definiere das Vehicle-Interface mit einer GetInfo() string-Methode
// TODO: 2. Definiere das Car-Struct mit den Feldern Brand (string) und Speed (int)
// TODO: 3. Implementiere die GetInfo()-Methode für Car
func main() {
// Eingabe lesen
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// Geschwindigkeits-String in Ganzzahl umwandeln
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. Erstelle eine Car-Instanz unter Verwendung von brand und speed, rufe dann GetInfo() auf
result := "" // Ersetze diese Zeile durch deine Implementierung
_ = brand
_ = speed
// Ergebnis ausgeben
fmt.Println(result)
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und Verhalten