Type Assertions
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 17 von 68.
Bei der Arbeit mit Interface-Variablen musst du häufig auf den tatsächlich darin gespeicherten konkreten Wert zugreifen. Hier kommen Typzusicherungen ins Spiel – sie ermöglichen es dir, den zugrunde liegenden Wert sicher zu extrahieren und zu verwenden.
Eine Typassertion verwendet diese Syntax: value, ok := interfaceVariable.(Type). Der erste Rückgabewert ist der extrahierte Wert des angegebenen Typs, und der zweite ist ein boolescher Wert, der dir mitteilt, ob die Assertion erfolgreich war.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}Die Variable ok ist entscheidend für die Sicherheit. Wenn du versuchst, den falschen Typ zu erzwingen, wird ok den Wert false haben, und value wird der Nullwert dieses Typs sein. Ohne ok zu überprüfen, würde eine fehlgeschlagene Typassertion dazu führen, dass dein Programm in Panik gerät.
Typzusicherungen sind bei der Arbeit mit interface{}-Werten unerlässlich. Sie ermöglichen es dir, das generische Interface wieder in einen bestimmten Typ umzuwandeln, sodass du dessen Methoden und Operationen verwenden kannst.
Aufgabe
EinfachIn dieser Herausforderung übst du die Verwendung von Typassertionen, um sicher konkrete Werte aus Interface-Variablen zu extrahieren und mit ihnen zu arbeiten. Du erstellst einen Datenanalysator, der verschiedene in leeren Interfaces gespeicherte Werttypen verarbeitet.
Du erhältst zwei Eingaben:
- Eine Zeichenkette, die den zu prüfenden Datentyp darstellt (z. B.
"int","string"oder"bool") - Eine Zeichenkette, die den tatsächlichen Wert darstellt (z. B.
"42","hello"oder"true")
Deine Aufgabe ist es:
- Die Wertzeichenkette in den entsprechenden Go-Typ umzuwandeln und sie in einer
interface{}-Variable zu speichern:- Für
"int": in eine Ganzzahl umwandeln - Für
"string": als Zeichenkette verwenden - Für
"bool": in einen booleschen Wert umwandeln
- Für
- Eine Typassertion zu verwenden, um zu prüfen, ob die Interface-Variable den erwarteten, in der ersten Eingabe angegebenen Typ enthält
- Wenn die Typassertion erfolgreich ist, Folgendes auszugeben:
"Success: [value] is a [type]" - Wenn die Typassertion fehlschlägt, Folgendes auszugeben:
"Failed: value is not a [type]"
Du musst die sichere Syntax für Typassertionen mit der ok-Variable verwenden, um zu prüfen, ob die Assertion erfolgreich war. Die Herausforderung testet dein Verständnis dafür, wie konkrete Werte sicher aus Interface-Variablen extrahiert werden, ohne dass dein Programm einen Panic auslöst.
Bei der Umwandlung in einen booleschen Wert soll "true" in true umgewandelt werden, und jede andere Zeichenkette soll in false umgewandelt werden. Verwende das Paket strconv für die Umwandlung einer Zeichenkette in eine Ganzzahl.
Probier es selbst
package main
import (
"fmt"
"strconv"
)
func main() {
// Eingabe lesen
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// Variable zum Speichern des Interface-Werts
var interfaceValue interface{}
// TODO: Schreibe deinen Code unten
// 1. Konvertiere valueStr basierend auf dataType in den passenden Typ und speichere ihn in interfaceValue
// 2. Verwende Type Assertion, um zu prüfen, ob interfaceValue den erwarteten Typ enthält
// 3. Gib die entsprechende Erfolgs- oder Fehlermeldung aus
}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Übe selbstständig: Online-Go-Compiler