Type Assertions
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 17 von 68.
Beim Arbeiten mit Interface-Variablen müssen Sie oft auf den tatsächlichen konkreten Wert zugreifen, der in ihnen gespeichert ist. Hier kommen Type Assertions ins Spiel – sie ermöglichen es Ihnen, den zugrunde liegenden Wert sicher zu extrahieren und zu verwenden.
Eine Type Assertion 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 angibt, ob die Zusicherung 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 Sie versuchen, eine Typzusicherung (Type Assertion) für den falschen Typ vorzunehmen, wird ok den Wert false haben und value wird der Nullwert dieses Typs sein. Ohne die Prüfung von ok würde eine fehlgeschlagene Typzusicherung dazu führen, dass Ihr Programm abstürzt (panic).
Type Assertions sind unerlässlich bei der Arbeit mit interface{}-Werten, da sie es ermöglichen, das generische Interface wieder in einen spezifischen Typ umzuwandeln, damit Sie dessen Methoden und Operationen nutzen können.
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 Verwendung von Type Assertions, um sicher konkrete Werte aus Interface-Variablen zu extrahieren und mit ihnen zu arbeiten. Sie erstellen einen Datenanalysator, der verschiedene Arten von Werten verarbeitet, die in leeren Interfaces gespeichert sind.
Sie erhalten zwei Eingaben:
- Ein String, der den zu prüfenden Datentyp darstellt (z. B.
"int","string"oder"bool") - Ein String, der den tatsächlichen Wert darstellt (z. B.
"42","hello"oder"true")
Ihre Aufgabe ist es:
- Konvertieren Sie den Wert-String in den entsprechenden Go-Typ und speichern Sie ihn in einer
interface{}-Variablen:- Für
"int": in einen Integer konvertieren - Für
"string": als String verwenden - Für
"bool": in einen Boolean konvertieren
- Für
- Verwenden Sie eine Type Assertion, um zu prüfen, ob die Interface-Variable den im ersten Input angegebenen erwarteten Typ enthält
- Wenn die Type Assertion erfolgreich ist, geben Sie aus:
"Success: [value] is a [type]" - Wenn die Type Assertion fehlschlägt, geben Sie aus:
"Failed: value is not a [type]"
Sie müssen die sichere Type-Assertion-Syntax mit der ok-Variablen verwenden, um zu prüfen, ob die Assertion erfolgreich war. Die Herausforderung testet Ihr Verständnis dafür, wie man sicher konkrete Werte aus Interface-Variablen extrahiert, ohne dass Ihr Programm einen Panic verursacht.
Für die Boolean-Konvertierung sollte "true" zu true konvertiert werden und jeder andere String zu false. Verwenden Sie das strconv-Paket für die Konvertierung von String zu Integer.
Spickzettel
Type-Assertions ermöglichen es Ihnen, konkrete Werte aus Interface-Variablen unter Verwendung der Syntax value, ok := interfaceVariable.(Type) zu extrahieren:
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 gibt an, ob die Assertion erfolgreich war. Wenn sie false ist, entspricht value dem Nullwert dieses Typs. Prüfen Sie ok immer, um Panics durch fehlgeschlagene Assertions zu verhindern.
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