Kanały (channels) są typami
Kanały w Go (chan) są typami i mogą być przekazywane między goroutines. Dzięki temu można tworzyć skomplikowane, ale eleganckie systemy komunikacji.
Goroutines ważą kilka KB
Goroutine to nie jest pełny systemowy wątek – to lekki obiekt o początkowym stosie ~2 KB. Można ich uruchomić dziesiątki tysięcy bez obciążenia systemu.
Brak funkcji typu map() i filter()
Go specjalnie nie zawiera typowych funkcji funkcyjnych znanych z JavaScript, Pythona czy Haskella – z założenia ma być prosty i czytelny, a nie „sprytny”.
Interfejsy są implementowane niejawnie
Jeśli typ ma wszystkie metody wymagane przez interfejs, automatycznie go implementuje – bez słowa implements. To daje ogromną elastyczność i brak zależności między modułami.
Inicjalizatory init()
Każdy plik może zawierać funkcję init(), która wykona się automatycznie przed main(). to idealne rozwiązanie do konfiguracji globalnych lub testów.
"Blank identifier" _
Używany do ignorowania niepotrzebnych wartości, np:
- val, _ := someFunc() // ignorujemy drugi zwracany element
Umożliwia to coś w rodzaju dziedziczenia poprzez „wstrzykiwanie” struktur:
- type Base struct {
- ID int
- }
- type User struct {
- Base
- Name string
- }
W Go nazwy z wielkiej litery są eksportowane (publiczne), a z małej – prywatne. Przykład: Println jest publiczne, println – nie.
Nieużywane zmienne to błąd
Jeśli zadeklarujesz zmienną, ale jej nie użyjesz, Go wyrzuci błąd kompilacji. To promuje czysty kod, chodź na początku może denerwować
Brak wyjątków (exceptions)
Go nie posiada klasycznego systemu wyjątków jak w Javie czy Pythonie. Obsługa błędów opiera się na zwracaniu wartości błędu (error) jako zwykłej wartości.
Wbudowana konkurencja (concurrency)
Go ma lekki system wątków zwany goroutines oraz kanały (channels) do komunikacji między nimi. To bardzo elegancki sposób na pisanie programów współbieżnych.
Brak dziedziczenia klasowego
Go nie ma typowej hierarchii klas znanej z OOP. Zamiast tego wykorzystuje kompozycję i interfejsy, co prowadzi do bardziej modularnego kodu.
Szybkie kompilacje
Jednym z celów Go była bardzo szybka kompilacja — kod kompiluje się błyskawicznie nawet przy dużych projektach.
Gofmt – narzędzie formatowania kodu
Go ma oficjalne narzędzie gofmt, które automatycznie formatuje kod zgodnie z jedynym słusznym stylem. To eliminuje kłótnie o style pisania kodu.
Prosty system budowania i zależności
Go od początku unikał ciężkich systemów jak make czy CMake, a teraz ma wbudowany system modułów (go mod).
Garbage Collector, ale lekki
Mimo że Go ma automatyczne zarządzanie pamięcią, jego GC jest bardzo szybki i zaprojektowany do pracy w czasie rzeczywistym.