Menu
Coddy logo textTech

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.

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

  1. 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
  2. Verwenden Sie eine Type Assertion, um zu prüfen, ob die Interface-Variable den im ersten Input angegebenen erwarteten Typ enthält
  3. Wenn die Type Assertion erfolgreich ist, geben Sie aus: "Success: [value] is a [type]"
  4. 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
	
}
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