Ponieważ część czytelników mojej strony, poza samym kursem Go, może interesować się kwestiami związanymi z samym językiem, to informuję, że dziś wydano Go w wersji 1.13, czyli całe środowisko programistyczne. W tym wpisie postaram się przełożyć na język polski co uległo zmianie w najnowszej wersji tego coraz popularniejszego języka programowania. A trochę tych zmian jest - tu link do pełnego Go 1.13 Release Notes, a ja spróbuję co nieco dla Was streścić, to, co uznałem za ciekawe w tej wersji.


Linia poleceń, platformy, moduły

W tej wersji, używanie polecenia go, np. do ściągnięcia jakiegoś liba (go get), powoduje domyślnie używanie bazy mirrorów i sum kontrolnych od Google (np: proxy.golang.org). To oznacza, że pojawiła się potrzeba ustanowienia polityki prywatności, co jest istotne, gdyż to polecenie będzie domyślnie łączyć się do infrastruktury firmy Google. Oczywiście są dostępne zmienne środowiskowe GOPRIVATE, GONOPROXY oraz GOPROXY, które pozwalają zmieniać to domyślne zachowanie - tutaj więcej informacji o tych opcjach i dokładnym działaniu tej komendy. Jeżeli w swoim projekcie bawisz się w prywatne źródła swoich modułów, warto zerknąć tutaj na przykład użycia w takim scenariuszu.

Jest trochę mniejszych lub większych zmian w zachowaniu go mod jak i np. go get w sytuacji używania go mod.

W kwestii supportowanych platform - teraz obiecywana jest kompatybilność z platformą Android w wersji 10. Jeśli chodzi o macOS, najstarsza obsługiwana wersja to 10.11 czyli El Captain. Wymaganą wersją FreeBSD z kolei jest 11.2 (lub nowsze). Pojawiło się wsparcie dla platformy illumos. Myślę, że to te najważniejsze kwestie dotyczące supportowanych platform tak na szybko.


Składnia języka

Pojawiła się obsługa niektórych literałów numerycznych, tutaj link do szczegółowej informacji. Z rzeczy ciekawszych, wielkie liczby można separować jak w niektórych innych językach, np: 1_000_000. Na stronie dokładniejsze info o regułach.

Z ważniejszych rzeczy - Error Values, odsyłam od razu tutaj do FAQ. Community jak i core team starają się w tej kwestii znaleźć konsensus od jakiegoś czasu. Ponoć ma się blogspot na ten temat pojawić, postaram się też go Wam streścić w razie czego.


Kompilator, assembler, runtime i pamięć

Dokładniejsza jest analiza “ucieczki zmiennych do sterty (heap)” w kompilatorze. Co to za analiza, ktoś może spytać? Na Gophers Silesia, 18 Września w Katowicach będę o niej mówił, także zapraszam, a Ci, którzy być nie mogą niech czekają na materiał z prezentacji. W każdym razie, w nowej wersji, zmienne częściej powinny lądować na stosie, a nie na heapie, zatem powinno to wpłynąć pozytywnie na wydajność aplikacji skompilowanej kompilatorem Go w tej właśnie wersji. Tak przynajmniej obiecują developerzy Go.

Sam Assembler, który jest generowany przez kompilator Go, doczekał się obsługi wielu atomicznych instrukcji ze specyfikacji ARM v8.1.

Z ciekawszych zmian w runtime: teraz jak w w slice s (przykład), którego długość wynosi np. 1, nastąpi odwołanie do elementu 5 (s[5]), to dostaniemy panic z informacją o tym, że chcemy elementu 5 w slice o długości jeden, dlatego mamy panic. Wcześniej mieliśmy tylko informację, że po prostu slice nie ma tylu elementów, jest out of bound no i sio.

Ponadto, według obietnic, ta wersja Go wprowadziła 30% wzrostu wydajności, przy większości przypadków użycia instrukcji defer. Ponadto runtime bardziej chętnie zwraca teraz pamięć do systemu niż bywało to wcześniej, przy czym, warto pamiętać, że jeśli używacie Linuksa to od razu tego możecie nie zauważyć dopóki system nie będzie chciał siegnąć do swoich zasobów. Jeżeli nie wiesz dlaczego Twój RAM nie wrócił do statystyk lub zastanawiasz się, skąd tak mało, gdy Ty masz go tak dużo na serwerze, to istnieje ciekawa strona w sieci, która wyjaśnia ten problem.

Jeśli masz nikłą wiedzę z kolei na temat działania samego GC w Go, to polecam ten artykuł.


Biblioteki

Niektóre ważniejsze moim zdaniem mniejsze lub większe zmiany:

net oraz net/http mają szczególnie dużo zmian, więc nie będę opisywał i odsyłam od razu.

  • crypto/tls - SSLv3 jest deprecated i będzie usunięte w wersji 1.14. Jeśli ktoś nie wie dlaczego, to tu jest wyjaśnienie.
  • strconv - jak base=0, to możecie skorzystać z nowej notacji podkreślnikowej dla czytelności (np: 1_000_000)
  • database/sql - pojawiły się typy NullTime i NullInt32. Osobom używającym namiętnie interface{} w takich sytuacjach, nieśmiało przypominam, że to niejedyne takie typy dostępne w puli.
  • time - Day-of-year supportowany przez Format i Parse

A tak poza tym na koniec, to unicode ma killer feature, bo obsługuje m.in. 66 nowych emoji.