Menu
Coddy logo textTech

Pusty interfejs (any)

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 28 z 107.

Pusty interfejs to interfejs, który nie ma żadnych metod. Ponieważ każdy typ w Go ma co najmniej zero metod, każdy typ automatycznie spełnia warunki pustego interfejsu. Dzięki temu może przechowywać wartości dowolnego typu.

var anything interface{}

anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}

W Go 1.18 wprowadzono słowo kluczowe any jako alias dla interface{}. Są całkowicie wymienne, ale any jest czytelniejsze.

var value any = "Go is awesome"

Pusty interfejs jest przydatny, gdy trzeba obsługiwać wartości o nieznanych lub zmiennych typach. Funkcje takie jak fmt.Println używają go, aby przyjmować argumenty dowolnego typu:

func PrintAnything(v any) {
    fmt.Println("Value:", v)
}

func main() {
    PrintAnything(100)
    PrintAnything("text")
    PrintAnything(3.14)
}

Istnieje jednak pewien kompromis. Gdy wartość jest przechowywana w pustym interfejsie, tracisz dostęp do informacji o jej konkretnym typie.

Nie możesz bezpośrednio wywoływać metod ani uzyskiwać dostępu do pól bez wcześniejszego wyodrębnienia bazowego typu. W następnych lekcjach dowiesz się, jak pobrać konkretny typ z pustego interfejsu za pomocą asercji typów i przełączników typów.

challenge icon

Wyzwanie

Łatwy

Zbudujmy elastyczny pojemnik do przechowywania, który może przechowywać wartości dowolnego typu za pomocą pustego interfejsu. Utworzysz proste pudełko, które pokazuje, jak any pozwala przechowywać różne typy w tej samej strukturze.

Rozmieścisz swój kod w dwóch plikach:

  • box.go: Zdefiniuj strukturę Box z jednym polem Content typu any. Utwórz funkcję konstruktora NewBox, która przyjmuje wartość dowolnego typu i zwraca wskaźnik do obiektu Box zawierającego tę wartość. Dodaj metodę Describe, która zwraca tekst opisujący, co jest przechowywane w pudełku.
  • main.go: Odczytaj różne wartości z wejścia, utwórz pudełka zawierające liczbę całkowitą, tekst i wartość logiczną, a następnie wyświetl opis każdego pudełka, aby pokazać, jak ten sam typ Box może przechowywać zupełnie różne wartości.

Dane wejściowe będą następujące:

  • Wiersz 1: Wartość całkowita
  • Wiersz 2: Wartość tekstowa
  • Wiersz 3: Wartość logiczna (true lub false)

Metoda Describe powinna zwracać tekst w następującym formacie:

Box contains: [value]

Na przykład dla wartości 42, hello i true wynik powinien wyglądać następująco:

Box contains: 42
Box contains: hello
Box contains: true

Najważniejszy wniosek jest taki, że pojedyncza struktura Box może przechowywać liczbę całkowitą, tekst lub wartość logiczną: wszystko dzięki temu, że typ any akceptuje wartości dowolnego typu. Każde pudełko przechowuje coś innego, a mimo to wszystkie są tego samego typu Box.

Spróbuj swoich sił

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Wczytaj wartość całkowitą
	line1, _ := reader.ReadString('\n')
	intVal, _ := strconv.Atoi(strings.TrimSpace(line1))

	// Wczytaj wartość tekstową
	line2, _ := reader.ReadString('\n')
	strVal := strings.TrimSpace(line2)

	// Wczytaj wartość logiczną
	line3, _ := reader.ReadString('\n')
	boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))

	// TODO: Utwórz pudełko dla każdej wartości za pomocą NewBox
	// TODO: Wypisz opis każdego pudełka za pomocą metody Describe

	// Użyj zmiennych, aby uniknąć błędów kompilacji (usuń te wiersze podczas implementacji)
	_ = intVal
	_ = strVal
	_ = boolVal

	// Przykładowy format wyjścia:
	// fmt.Println(box.Describe())
}
quiz iconSprawdź się

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

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online