Menu
Coddy logo textTech

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}  // Slice

Dies 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.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

challenge icon

Aufgabe

Einfach

In 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:

  1. Erstellen Sie eine Funktion namens processData, die einen interface{}-Parameter entgegennimmt und Informationen über den Wert ausgibt.
  2. 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
  3. Rufen Sie die Funktion processData mit dem konvertierten Wert auf.
  4. Geben Sie innerhalb von processData den 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}  // slice

Das 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
	
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf