Menu
CoddyTech

Eksportowane a nieeksportowane

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

W Go widoczność identyfikatorów (zmiennych, funkcji, typów itd.) jest kontrolowana przez prostą konwencję nazewnictwa. Określa ona, czy kod z innych pakietów może uzyskać dostęp do Twoich identyfikatorów.

Eksportowane identyfikatory zaczynają się wielką literą i są dostępne z innych pakietów. Możesz myśleć o nich jak o „publicznych” — może ich używać każdy, kto zaimportuje Twój pakiet.

// Te są eksportowane (publiczne)
var Name string
func Calculate() int
type Person struct

Nieeksportowane identyfikatory zaczynają się od małej litery i są dostępne tylko w obrębie tego samego pakietu. Są „prywatne” dla twojego pakietu.

// Te elementy są nieeksportowane (prywatne)
var age int
func helper() string
type config struct

Ta konwencja nazewnictwa to sposób Go na kontrolowanie dostępu bez konieczności używania słów kluczowych takich jak public czy private. Gdy spróbujesz użyć nieeksportowanego identyfikatora z innego pakietu, Go zgłosi błąd kompilacji, ponieważ ten identyfikator nie jest widoczny poza swoim pakietem.

challenge icon

Wyzwanie

Łatwy

Napraw problemy z widocznością w pakiecie Go, poprawiając konwencję nazewnictwa identyfikatorów eksportowanych i nieeksportowanych. Będziesz pracować z symulowanym scenariuszem obejmującym wiele pakietów, w którym niektóre identyfikatory mają niepoprawne nazwy, co powoduje błędy kompilacji przy dostępie do nich z innych pakietów.

Otrzymasz dwa dane wejściowe:

  • Łańcuch zawierający definicje pakietów w formacie "package_name:identifier1:type1:visibility1,identifier2:type2:visibility2|package_name:identifier1:type1:visibility1" (np. "utils:helper:function:private,Calculate:function:public|main:name:variable:private,Version:variable:public")
  • Łańcuch zawierający próby dostępu w formacie "accessing_package.identifier1,accessing_package.identifier2,accessing_package.identifier3" (np. "main.helper,main.Calculate,utils.Version")

Twoje zadanie:

  1. Przeanalizuj pierwsze dane wejściowe, dzieląc je po pionowych kreskach, aby uzyskać poszczególne definicje pakietów
  2. Dla każdej definicji pakietu podziel ją po dwukropkach, aby uzyskać nazwę pakietu i jego identyfikatory
  3. Dla każdej definicji identyfikatora podziel ją po dwukropkach, aby uzyskać nazwę identyfikatora, typ i zamierzoną widoczność
  4. Utwórz funkcję o nazwie fixIdentifierName, która przyjmuje nazwę identyfikatora i zamierzoną widoczność, a następnie zwraca poprawioną nazwę:
    • Jeśli widoczność to "public", upewnij się, że identyfikator zaczyna się wielką literą
    • Jeśli widoczność to "private", upewnij się, że identyfikator zaczyna się małą literą
  5. Wyświetl nagłówek analizy pakietów: "=== PACKAGE VISIBILITY ANALYSIS ==="
  6. Dla każdego pakietu wyświetl informacje o pakiecie:
    • "Package: [package_name]"
    • Dla każdego identyfikatora w pakiecie:
      • Jeśli nazwa identyfikatora wymaga poprawy: "- [original_name] ([type]) -> [corrected_name] (visibility: [visibility])"
      • Jeśli nazwa identyfikatora jest poprawna: "- [identifier_name] ([type]) (visibility: [visibility]) ✓"
    • Przeanalizuj drugie dane wejściowe, dzieląc je po przecinkach, aby uzyskać poszczególne próby dostępu
    • Dla każdej próby dostępu podziel ją po kropkach, aby uzyskać pakiet uzyskujący dostęp i identyfikator, do którego następuje dostęp
    • Wyświetl nagłówek weryfikacji dostępu: "=== ACCESS VALIDATION ==="
    • Dla każdej próby dostępu określ, czy dostęp jest prawidłowy:
      • Znajdź pakiet zawierający identyfikator
      • Sprawdź, czy poprawiona nazwa identyfikatora zaczyna się wielką literą (jest eksportowany)
      • Jeśli identyfikator jest eksportowany: "[accessing_package] accessing [target_package].[corrected_identifier_name]: ✓ ALLOWED (exported)"
      • Jeśli identyfikator nie jest eksportowany: "[accessing_package] accessing [target_package].[corrected_identifier_name]: ✗ DENIED (unexported)"
      • Jeśli identyfikator nie istnieje: "[accessing_package] accessing unknown.[identifier_name]: ✗ NOT FOUND" (wypisz słowo unknown jako nazwę pakietu; ta próba jest liczona jako odmowa dostępu)
    • Policz i wyświetl statystyki podsumowujące:
      • "=== SUMMARY ==="
      • "Total packages analyzed: [number_of_packages]"
      • "Total identifiers processed: [total_number_of_identifiers]"
      • "Identifiers requiring fixes: [number_of_identifiers_that_needed_fixing]"
      • "Access attempts: [number_of_access_attempts]"
      • "Allowed accesses: [number_of_allowed_accesses]"
      • "Denied accesses: [number_of_denied_accesses]"
    • Wyświetl końcowe zalecenia:
      • Jeśli były identyfikatory wymagające poprawy: "Recommendation: Fix identifier naming to follow Go conventions"
      • Jeśli wszystkie identyfikatory były poprawne: "All identifiers follow proper Go naming conventions"

Użyj pakietu strings, aby dzielić łańcuchy wejściowe, pakietu fmt do formatowanego wyjścia oraz funkcji do manipulowania łańcuchami, aby sprawdzać i modyfikować nazwy identyfikatorów. To wyzwanie pokazuje, jak konwencja nazewnictwa w Go kontroluje widoczność pakietów i pomaga zrozumieć różnicę między identyfikatorami eksportowanymi i nieeksportowanymi.

Spróbuj swoich sił

package main

import (
	"fmt"
	"strings"
)

func main() {
	// Wczytaj dane wejściowe
	var packageDefinitions string
	var accessAttempts string
	fmt.Scanln(&packageDefinitions)
	fmt.Scanln(&accessAttempts)

	// TODO: Napisz swój kod poniżej
	
	// Utwórz funkcję fixIdentifierName
	
	// Przeanalizuj definicje pakietów
	
	// Wyświetl analizę pakietów
	
	// Przeanalizuj próby dostępu
	
	// Wyświetl wyniki weryfikacji dostępu
	
	// Oblicz i wyświetl statystyki podsumowujące
	
	// Wyświetl zalecenia
}
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