Powrót do strony głównej

Projektowanie bibliotek Go: terminy i zasoby

Artykuł omawia projektowanie bibliotek w Go: definicje repozytoriów, pakietów, modułów. Opisano typy bibliotek z zasobami — kod, sterowniki CUDA, statyczne teksty. Podkreślono cechy: izolacja, dekompozycja, kompozycja.

Biblioteki Go: od kodu do sterowników GPU i tekstów
Advertisement 728x90

Zasady projektowania bibliotek w Go: od repozytoriów do zasobów

Programowanie obejmuje tworzenie aplikacji i bibliotek do ich wsparcia. Biblioteka to zbiór zasobów do współdzielenia, głównie kodu źródłowego. Rozróżnienie terminów pomaga projektować trwałe komponenty.

Repozytorium zawiera pliki z kodem w strukturze plików. Pakiet w Go to grupa plików .go, wykonujących jedno zadanie, z obowiązkową deklaracją package na początku każdego pliku. Moduł łączy pakiety, zależności są ustalane w go.mod.

Biblioteka zapewnia podział kodu bez duplikacji. Przykład: funkcja MaxInt jest kopiowana do różnych pakietów foo i baz, ale bez jednego źródła prawdy jest to nieefektywne. Pakiety rozwiązują problem kompilacji i importu.

Google AdInline article slot
package foo

func MaxInt(a, b int) int {
    if a > b {
        return a
    }
    return b
}

Izolacja komponentów zapobiega wiedzy o cudzym kodzie, dekompozycja upraszcza interakcję z kompilatorem.

Zasoby w bibliotekach

Biblioteki obejmują nie tylko kod, ale także zewnętrzne zasoby: dynamiczne i statyczne.

Zasoby dynamiczne zależą od czasu wykonania. Przykład — dostęp do GPU przez CUDA w pakiecie cu z Gorgonia:

Google AdInline article slot
d := cu.CurrentDevice()
ctx := cu.NewContext(d, cu.SchedAuto|cu.MapHost)
mem, err := ctx.MemAlloc(1024)

Tutaj ctx to deskryptor GPU dla zadań GPGPU. Stan jest nieznany na etapie kompilacji.

Zasoby statyczne są znane kompilatorowi. Przykład — teksty Szekspira w pakiecie willshakes:

package willshakes

const AllsWellThatEndsWell = `Akt 1 Scena 1

HRABINA.
    Oddając syna, grzebię drugiego męża.
...`

const MacBeth = `Akt 1 Scena 1

PIERWSZA WIEDŹMA.
    Kiedy znów się spotkamy we trzy
...`

Dostęp: willshakes.MacBeth. Podobnie czcionki lub zbiory danych jak MNIST.

Google AdInline article slot

Klasyfikacja bibliotek

Biblioteki dzielą się na klasy według zasobów:

  • Biblioteki kodu: współdzielony kod źródłowy w pakietach/modułach.
  • Biblioteki sterowników: nakładki na sterowniki (cu dla CUDA, go-gl dla OpenGL).
  • Biblioteki zasobów: dane statyczne (willshakes) lub ładowarki (mnist w Go).

| Typ | Przykład | Charakterystyka |

|-----|--------|----------------|

| Kodowa | Pakiet z narzędziami | Kod statyczny |

| Sterownikowa | cu | Dostęp dynamiczny |

| Zasobowa | willshakes | Wbudowane stałe |

Sterowniki dodają abstrakcje dla interakcji międzyjęzykowej.

Cechy dobrej biblioteki

Dobra biblioteka ułatwia dwa dialogi: z maszyną (kompilator/czas wykonania) i z programistą.

Kryteria:

  • Izolacja: komponenty nie znają zewnętrznych bibliotek.
  • Dekompozycja: wyraźne granice funkcjonalności.
  • Kompozycja: prosta integracja w aplikacjach.
  • Przewidywalność: zachowanie zgodne z dokumentacją.
  • Wydajność: minimalne obciążenie bez kompromisów.

Unikaj package main w bibliotekach — skup się na narzędziach. Testuj przypadki brzegowe, zapewniaj bezpieczeństwo wątków.

Co jest ważne

  • Biblioteka to współdzielony zasób, nie tylko repozytorium lub pakiet.
  • Rozdzielaj zasoby statyczne (stałe) i dynamiczne (sterowniki).
  • Zapewnij izolację dla skupienia programisty na jednym zadaniu.
  • Używaj pakietów Go do kompilacji i modułów do zależności.
  • Projektuj pod kątem kompozycji: prostota importu i użycia.

— Editorial Team

Advertisement 728x90

Czytaj dalej