Leeres Interface
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 16 von 68.
Bisher haben Sie mit Interfaces gearbeitet, die bestimmte Methoden erfordern, aber Go hat ein spezielles Interface, das unglaublich flexibel ist: das leere Interface, geschrieben als interface{}.
Das leere Interface hat keinerlei Methodenanforderungen, was bedeutet, dass jeder Typ in Go es automatisch erfüllt. Da jeder Typ (mindestens) null Methoden implementiert, kann jeder Typ einer interface{}-Variablen zugewiesen werden:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // SliceDies macht interface{} extrem nützlich, wenn Sie mit Daten unbekannter oder variierender Typen arbeiten müssen. Dies kann Ihnen beim Lesen von Konfigurationsdateien, beim Verarbeiten von Benutzereingaben oder bei der Arbeit mit APIs begegnen, die je nach Situation unterschiedliche Datentypen zurückgeben.
Da das leere Interface jedoch jeden Typ aufnehmen kann, müssen Sie oft bestimmen, welcher Typ tatsächlich darin gespeichert ist, bevor Sie den Wert sinnvoll verwenden können. Hier werden Type-Assertions und Type-Switches (über die Sie als Nächstes mehr erfahren werden) zu unverzichtbaren Werkzeugen für die sichere Arbeit mit interface{}-Werten.
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 den Umgang mit dem leeren Interface, indem Sie einen Datenprozessor erstellen, der verschiedene Arten von Werten verarbeiten kann. Sie erstellen eine Funktion, die einen interface{}-Parameter akzeptiert und verschiedene Datentypen verarbeitet.
Sie erhalten zwei Eingaben:
- Einen String, der den Datentyp repräsentiert (z. B.
"int","string","bool"oder"slice") - Einen String, der den tatsächlichen Wert repräsentiert (z. B.
"42","hello","true"oder"1,2,3")
Ihre Aufgabe ist es:
- Erstellen Sie eine Funktion namens
processData, die eineninterface{}-Parameter entgegennimmt und Informationen über den Wert ausgibt. - Konvertieren Sie basierend auf der Datentyp-Eingabe den Wert-String in den entsprechenden Go-Typ:
- Für
"int": in einen Integer konvertieren - Für
"string": als String verwenden - Für
"bool": in einen Boolean konvertieren - Für
"slice": kommagetrennte Werte in einen Slice von Integern konvertieren
- Für
- Rufen Sie die Funktion
processDatamit dem konvertierten Wert auf. - Geben Sie innerhalb von
processDataden Wert und seinen Typ im Format"Value: [value], Type: [type]"aus.
Für die Slice-Eingabe sollte der kommagetrennte String wie "1,2,3" in []int{1, 2, 3} konvertiert werden. Die Funktion sollte mit jedem Typ funktionieren, da sie interface{} akzeptiert, was demonstriert, wie das leere Interface Werte eines beliebigen Typs aufnehmen kann. Verwenden Sie fmt.Printf mit den Format-Verben %v und %T, um den Wert bzw. den Typ anzuzeigen.
Spickzettel
Das leere Interface interface{} hat keine Methodenanforderungen, was bedeutet, dass jeder Typ in Go es automatisch erfüllt:
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceDas leere Interface ist nützlich für die Arbeit mit Daten unbekannter oder variierender Typen, wie z. B. Konfigurationsdateien, Benutzereingaben oder APIs, die unterschiedliche Datentypen zurückgeben.
Verwenden Sie fmt.Printf mit den Format-Verben %v und %T, um den Wert und den Typ einer interface{}-Variablen anzuzeigen:
fmt.Printf("Value: %v, Type: %T", value, value)Nützliche Konvertierungshelfer aus der Standardbibliothek:
import (
"strconv"
"strings"
)
// Convert string to int
n, err := strconv.Atoi("42") // n = 42
// Convert string to bool
b, err := strconv.ParseBool("true") // b = true
// Split a string into a slice
parts := strings.Split("a,b,c", ",") // ["a", "b", "c"]Probier es selbst
package main
import (
"fmt"
)
func main() {
// Eingabe lesen
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// TODO: Schreiben Sie Ihren Code unten
// 1. Erstellen Sie die Funktion processData, die interface{} akzeptiert
// 2. Konvertieren Sie valueStr in den entsprechenden Typ basierend auf dataType
// 3. Rufen Sie processData mit dem konvertierten Wert auf
}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