Wydanie Go 1.22

Wydano wersję języka programowania Go 1.22, który rozwijany jest przez firmę Google przy współpracy z społecznością jako hybrydowe rozwiązanie łączące wysoką wydajność kompilowanych języków z takimi zaletami języków skryptowych, jak łatwość pisania kodu, szybkość rozwoju i ochrona przed błędami. Kod projektu jest dystrybuowany na licencji BSD.

Składnia Go opiera się na znanych elementach języka C z dodatkowymi zapożyczeniami z języka Oberon. Język jest dość zwięzły, ale jednocześnie kod jest łatwy do odczytania i zrozumienia. Kod napisany w języku Go kompilowany jest do oddzielnych binarnych plików wykonywalnych, które działają natywnie, bez użycia maszyny wirtualnej (moduły profilowania, debugowania i inne systemy wykrywania problemów są integrowane jako komponenty runtime), co umożliwia osiągnięcie wydajności porównywalnej z programami w języku C.

Projekt jest początkowo rozwijany z myślą o programowaniu wielowątkowym i efektywnej pracy w systemach wielordzeniowych, w tym zapewniając na poziomie operatorów środki do organizacji równoległych obliczeń oraz interakcji między równolegle wykonywanymi metodami. Język również oferuje wbudowane środki ochrony przed przekroczeniem dozwolonych obszarów przydzielonej pamięci i zapewnia możliwość korzystania z garbage collectora.

Wśród zmian w nowej wersji:

  • Do pętli 'for' dodano wsparcie dla określania zakresów z liczb całkowitych, na przykład do iteracji wartości od 0 do 9 można teraz używać pętli 'for i := range 10 {…}'.
  • Do pętli 'for' dodano eksperymentalne (GOEXPERIMENT=rangefunc) wsparcie dla funkcji określających zakres, co pozwala na wskazanie funkcji jako iteratora. Przykład: 'for i, x := range slices.Backward(s) {…}'.
  • Rozwiązano odwieczny problem z pętli 'for', który prowadził do współdzielenia zmiennych pętli w różnych iteracjach podczas wywoływania gorutyn (goroutine). Na przykład kod values := []string{"a", "b", "c"} for _, v := range values { go func() { fmt.Println(v) done <- true } } teraz będzie wyświetlać 'a', 'b' i 'c', a nie tylko 'c' jak wcześniej.
  • Przeprowadzono optymalizację zarządzania pamięcią w runtime, co doprowadziło do zwiększenia wydajności o 1-3% i zmniejszenia zużycia pamięci w większości aplikacji o 1%.
  • Kontynuowane są prace nad wdrażaniem w kompilatorze optymalizacji opartych na wynikach profilowania kodu (PGO — optymalizacja kierowana profilowaniem), które umożliwiają uwzględnienie szczególnych cech ustalanych podczas wykonywania programu. W nowej wersji w kompilatorze zastosowano narzędzia do devirtualizacji, aby zastąpić pośrednie wywołania różnych metod realizacją rozwiniętych bloków inline.
  • Przy włączonym PGO, wprowadzone zmiany pozwoliły zwiększyć wydajność większości programów o 2-14%.
  • Do kompilatora dodano eksperymentalną (GOEXPERIMENT=newinliner) ulepszoną implementację mechanizmu rozwijania (inlining) wywołań, która wykorzystuje heurystykę do rozdzielania operacji ważnych i drugorzędnych.
  • Do standardowej biblioteki dodano pakiet „math/rand/v2”, w którym zaproponowano bardziej spójne API i zastosowano szybsze algorytmy generowania liczb pseudolosowych.
  • W pakiecie net/http.ServeMux dodano możliwość wskazywania metod i masek w szablonach, na przykład szablon „GET /static/{id}/” będzie stosowany do żądań z metodą HTTP „GET” i zachowa wartość drugiego segmentu ścieżki żądania w identyfikatorze „id”.
  • W pakiecie database/sql dodano obsługę typu Null[T], który pozwala na skanowanie kolumn, które mogą przyjmować wartość NULL. W pakiecie slices dodano funkcję Concat do łączenia kilku slice'ów dowolnego typu.
  • W poleceniach związanych z przestrzeniami roboczymi (kolekcjami modułów) wprowadzono możliwość korzystania z katalogu „vendor”, zawierającego zależności do zawartości przestrzeni roboczej. Katalog ten jest tworzony podczas wykonywania polecenia „go work vendor” i używany w poleceniach kompilacji przy ustawieniu opcji '-mod=vendor' (domyślnie włączone, jeśli katalog vendor istnieje).

Zmiany w zachowaniu narzędzi.

  • go get nie jest już wspierane poza modułem w przestarzałym trybie GOPATH (tj. z GO111MODULE=off). Inne polecenia kompilacji, takie jak go build i go test, będą nadal działać dla przestarzałych programów GOPATH przez nieokreślony czas.
  • go mod init nie próbuje już importować wymagań modułów z plików konfiguracyjnych innych narzędzi dostawców (takich jak Gopkg.lock).
  • go test -cover teraz drukuje podsumowanie pokrycia dla pakietów, które są pokrywane, ale nie mają własnych plików testowych. Do Go 1.22 go test -cover dla takiego pakietu informowałby? mymod/mypack [brak plików testowych]

    a teraz z Go 1.22 funkcje w pakiecie są uważane za niepokryte: mymod/mypack coverage: 0.0% instrukcji. Zauważ: jeśli pakiet w ogóle nie zawiera wykonywalnego kodu, nie możemy podać znaczącego procentu pokrycia; dla takich pakietów go test nadal będzie informować o braku plików testowych.

  • Interfejs internetowy narzędzia trace został nieznacznie zaktualizowany w ramach pracy nad obsługą nowego narzędzia do śledzenia, rozwiązano kilka problemów i poprawiono czytelność różnych stron. Interfejs internetowy teraz obsługuje badanie śledzeń w widoku zorientowanym na strumień. Narzędzie do przeglądania śledzenia teraz również wyświetla całkowity czas trwania wszystkich wywołań systemowych. Te ulepszenia mają zastosowanie tylko do przeglądania śledzeń stworzonych przez programy stworzone w Go 1.22 lub nowszym. W przyszłym wydaniu niektóre z tych ulepszeń zostaną wprowadzone do śledzeń stworzonych przez starsze wersje Go.
  • Środowisko uruchomieniowe teraz przechowuje metadane zbierania śmieci na podstawie typów bliżej każdego obiektu w stercie. Ta zmiana również zmniejsza zużycie pamięci przez większość programów Go o około 1% dzięki deduplikacji nadmiarowych metadanych. W niektórych programach poprawa może być mniejsza, ponieważ ta zmiana koryguje granice klas rozmiaru przydzielacza pamięci, więc niektóre obiekty mogą zostać przeniesione do wyższej klasy rozmiaru. Skutkiem tej zmiany jest to, że adresy niektórych obiektów, które wcześniej były zawsze wyrównane do granicy 16 bajtów (lub wyżej), teraz będą wyrównane tylko do granicy 8 bajtów. Niektóre programy korzystające z instrukcji asemblera, które wymagają, aby adresy pamięci były wyrównane do rozmiaru większego niż 8 bajtów i polegają na wcześniejszym zachowaniu wyrównania przydzielacza pamięci, mogą przestać działać, ale spodziewamy się, że takie programy będą rzadkie. Takie programy mogą być tworzone z GOEXPERIMENT=noallocheaders, co pozwala na powrót do starego modelu metadanych i przywrócenie wcześniejszego zachowania wyrównania, ale właściciele pakietów powinni zaktualizować swój kod asemblera, aby uniknąć założeń dotyczących wyrównania, ponieważ ta obejście zostanie usunięta w przyszłej wersji.
  • Jak wspomniano w uwagach do wydania Go 1.20, Go 1.22 teraz wymaga finalnej wersji Go 1.20 lub nowszej do początkowej kompilacji. Spodziewamy się, że Go 1.24 będzie wymagać finalnej wersji Go 1.22 lub nowszej dla początkowej kompilacji.
    Oryginał (go.dev)

Źródło: linux.org.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster