0Pricing
Go Academy · Lekcja

Mapy jako zbiory

Używaj map do przechowywania unikatowych wartości

Mapy jako zbiory to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Go nie ma typu set

Go nie ma wbudowanego typu set. Idiomatyczny sposób modelowania zbioru unikatowych wartości polega na użyciu mapy, w której klucze są elementami zbioru.

Mapa wartości bool

Jedno z rozwiązań to map[string]bool. Obecność klucza (oraz wartość true) oznacza, że element należy do zbioru.

package main

import "fmt"

func main() {
	set := map[string]bool{}
	set["apple"] = true
	set["banana"] = true
	fmt.Println(set)
}

Sprawdzanie przynależności

Do sprawdzania przynależności należy użyć comma-ok albo bezpośrednio odczytać wartość bool.

package main

import "fmt"

func main() {
	set := map[string]bool{"apple": true}
	fmt.Println(set["apple"])
	fmt.Println(set["cherry"])
}

Mapa pustych struktur

Bardziej oszczędny pamięciowo zbiór można utworzyć za pomocą map[string]struct{}. Pusta struktura zajmuje zero bajtów, więc przechowywane są wyłącznie klucze.

package main

import "fmt"

func main() {
	set := map[string]struct{}{}
	set["x"] = struct{}{}
	_, ok := set["x"]
	fmt.Println("x in set:", ok)
}

Dlaczego pusta struktura

W zbiorze wartość nigdy nie ma znaczenia — liczy się tylko klucz. struct{}{} sygnalizuje zamiar ignorowania wartości i nie zużywa dodatkowej pamięci na każdy wpis.

Dodawanie elementów

Dodanie zduplikowanego klucza nie przynosi żadnego efektu, więc zbiór w naturalny sposób zapewnia unikatowość elementów.

package main

import "fmt"

func main() {
	set := map[string]struct{}{}
	set["a"] = struct{}{}
	set["a"] = struct{}{}
	fmt.Println("size:", len(set))
}

Usuwanie duplikatów

Klasyczne zastosowanie to usuwanie duplikatów z wycinka. Należy dodać każdy element do zbioru, a następnie odczytać unikatowe klucze.

package main

import "fmt"

func main() {
	input := []string{"a", "b", "a", "c", "b"}
	set := map[string]struct{}{}
	for _, v := range input {
		set[v] = struct{}{}
	}
	fmt.Println("unique count:", len(set))
}

Tworzenie wycinka unikatowych elementów

Połączenie zbioru z wycinkiem wynikowym pozwala zachować kolejność pierwszego wystąpienia i jednocześnie usunąć duplikaty.

package main

import "fmt"

func main() {
	input := []int{1, 2, 1, 3, 2}
	seen := map[int]struct{}{}
	result := []int{}
	for _, v := range input {
		if _, ok := seen[v]; !ok {
			seen[v] = struct{}{}
			result = append(result, v)
		}
	}
	fmt.Println(result)
}

Przecięcie zbiorów

Aby znaleźć elementy wspólne dla dwóch zbiorów, należy przeiterować po jednym z nich i zachować te elementy, które występują w drugim.

package main

import "fmt"

func main() {
	a := map[int]struct{}{1: {}, 2: {}, 3: {}}
	b := map[int]struct{}{2: {}, 3: {}, 4: {}}
	for k := range a {
		if _, ok := b[k]; ok {
			fmt.Println("common:", k)
		}
	}
}

Usuwanie ze zbioru

Do usunięcia elementu ze zbioru należy użyć funkcji delete.

package main

import "fmt"

func main() {
	set := map[string]struct{}{"a": {}, "b": {}}
	delete(set, "a")
	_, ok := set["a"]
	fmt.Println("a in set:", ok)
}

Wybór między bool a struct{}

Oba rozwiązania działają. Proszę użyć map[T]bool, gdy czytelność wyrażenia set[x] jako wartości bool jest pomocna. Proszę użyć map[T]struct{}, gdy chcą Państwo zaznaczyć, że wartość nie ma znaczenia, i oszczędzić pamięć w dużych zbiorach.

Szybkie sprawdzenie

Dlaczego w przypadku zbiorów często preferuje się map[string]struct{} zamiast map[string]bool?

Podsumowanie

Mapy jako zbiory:

  • Go nie ma typu set; należy używać mapy, której kluczami są elementy
  • map[T]bool lub map[T]struct{}
  • Świetnie nadają się do usuwania duplikatów i sprawdzania przynależności

Często zadawane pytania

Czy lekcja „Mapy jako zbiory” jest bezpłatna?

Tak — pełny tekst „Mapy jako zbiory” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Mapy jako zbiory”?

Używaj map do przechowywania unikatowych wartości Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Mapy jako zbiory”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Wewnętrzne działanie map
  2. Sprawdzanie istnienia
  3. Mapy jako zbiory
  4. Iterowanie i kolejność
← Powrót do Go Academy