Menu
Coddy logo textTech

Asercje typu

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 17 z 68.

Podczas pracy ze zmiennymi interfejsowymi często trzeba uzyskać dostęp do konkretnej wartości przechowywanej w ich wnętrzu. Właśnie do tego służą asercje typów — pozwalają bezpiecznie wyodrębnić i wykorzystać tę wartość.

Asercja typu używa następującej składni: value, ok := interfaceVariable.(Type). Pierwsza zwracana wartość to wyodrębniona wartość określonego typu, a druga to wartość logiczna informująca, czy asercja się powiodła.

var data interface{} = 42

number, ok := data.(int)
if ok {
    fmt.Println("It's an integer:", number)
} else {
    fmt.Println("Not an integer")
}

Zmienna ok ma kluczowe znaczenie dla bezpieczeństwa. Jeśli spróbujesz wykonać asercję nieprawidłowego typu, ok będzie miało wartość false, a value będzie wartością zerową tego typu. Bez sprawdzenia ok nieudana asercja typu spowodowałaby panikę programu.

Asercje typów są niezbędne podczas pracy z wartościami interface{}, ponieważ umożliwiają konwersję ogólnego interfejsu z powrotem na konkretny typ, dzięki czemu możesz używać jego metod i operacji.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu przećwiczysz używanie asercji typów do bezpiecznego pobierania i wykorzystywania konkretnych wartości ze zmiennych interfejsowych. Utworzysz analizator danych, który przetwarza różne typy wartości przechowywanych w pustych interfejsach.

Otrzymasz dwa dane wejściowe:

  • Łańcuch znaków reprezentujący typ danych, którego należy szukać (np. "int", "string" lub "bool")
  • Łańcuch znaków reprezentujący rzeczywistą wartość (np. "42", "hello" lub "true")

Twoim zadaniem jest:

  1. Przekonwertować łańcuch znaków z wartością na odpowiedni typ Go i zapisać go w zmiennej typu interface{}:
    • Dla "int": przekonwertować na liczbę całkowitą
    • Dla "string": użyć jako łańcucha znaków
    • Dla "bool": przekonwertować na wartość logiczną
  2. Użyć asercji typu, aby sprawdzić, czy zmienna interfejsowa zawiera typ oczekiwany, określony w pierwszym wejściu
  3. Jeśli asercja typu się powiedzie, wyświetlić: "Success: [value] is a [type]"
  4. Jeśli asercja typu się nie powiedzie, wyświetlić: "Failed: value is not a [type]"

Musisz użyć bezpiecznej składni asercji typu ze zmienną ok, aby sprawdzić, czy asercja się powiodła. Wyzwanie sprawdza, czy rozumiesz, jak bezpiecznie pobierać konkretne wartości ze zmiennych interfejsowych bez powodowania paniki programu.

Podczas konwersji na wartość logiczną "true" powinno zostać przekonwertowane na true, a każdy inny łańcuch znaków powinien zostać przekonwertowany na false. Do konwersji łańcucha znaków na liczbę całkowitą użyj pakietu strconv.

Spróbuj swoich sił

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// Wczytaj dane wejściowe
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// Zmienna do przechowywania wartości interfejsu
	var interfaceValue interface{}
	
	// TODO: Napisz swój kod poniżej
	// 1. Przekonwertuj valueStr na odpowiedni typ na podstawie dataType i zapisz wynik w interfaceValue
	// 2. Użyj asercji typu, aby sprawdzić, czy interfaceValue zawiera wartość oczekiwanego typu
	// 3. Wyświetl odpowiedni komunikat o powodzeniu lub niepowodzeniu
	
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online