Zmienne
Deklaracja zmiennej
Jak się okazuje zmienne w Go można zadeklarować na wiele różnych sposobów. Zaczniemy od najbardziej podstawowej formy:
var x string
Deklaracja zmiennej składa się ze słowa kluczowego "var", następnie określamy nazwę zmiennej (w tym przypadku "x") oraz jej typ (tu "string"). Gdy chcemy zadeklarować więcej zmiennych danego typu na raz możemy dodać kolejne identyfikatory zmiennych rozdzielone przecinkami:
var x, y string
W tym przypadku zadeklarowaliśmy zmienne "x" i "y", których typ to string. Deklaracja zmiennej kończy się na typie, przez co nie da się zadeklarować (bez inicjacji) wielu zmiennych różnych typów w jednej linii:
var x, y string, z int8 //!!!TO SIĘ NIE SKOMPILUJE!!!
Jeśli ktoś nie lubi pisać zbyt wielu słówek "var" (gusta są różne), to można zgrupować te deklaracje ujmując je w nawiasach:
var (
x, y string
z int8
)
Definicja zmiennej
Warto wiedzieć, że zmienne są automatycznie inicjowane wartościami tzw. "zero-typu", dla typów numerycznych to będzie po prostu 0, dla stringów pusty string etc.(więcej o typach napiszę w innym artykule
). Jeśli chcemy zainicjować zmienne w momencie deklaracji wystarczy dopisać "=" oraz tyle samo wyrażeń zwracających wartości rozdzielonych przecinkami co zmiennych:var a string = "a"
var b, c, d int8 = 1, 2, 3
Ponieważ Go jest statycznie typowany, możemy pominąć określenia typu i zostawić tą żmudną robotę kompilatorowi (on wywnioskuje typ z wyniku wyrażenia):
var a = 1
var b = rand.Float64()
var c, d = "alamakota", rand.Float64()
Możemy także pozbyć się słówka var dzięki operatorowi :=
, definicja zmiennych
może wyglądać tak:
a := 1
b, c := "alamakota", 2
Widoczność zmiennej
Widoczność zmiennych kontrolowana jest przez bloki kodu którymi są m.in.: pakiety, pliki, funkcje i pętle. Każdy identyfikator jest widoczny od momentu deklaracji do końca właściwego bloku we wszystkich blokach w nim zagnieżdżonych. Dla przykładu przeanalizujmy następujący program:
1) Nazwa pakietu main
nie jest trzymana w żadnym z zasięgów, ona tylko
informuje kompilator o nazwie pakietu.
2) Pakiet fmt
, został zaimportowany do zasięgu pliku i jego identyfikator może
zostać użyty gdziekolwiek w tym pliku, jeśli jakiś pakiet jest podzielony na
kilka plików źródłowych w każdym z nich należy zaimportować potrzebne pakiety
3) Zmienna s
, jako zadeklarowana poza jakąkolwiek funkcją zostanie przypisana
do zasięgu pakietu (jak nazwa funkcji main
)
4) Zmienna s1
będzie egzystować w bloku funkcji i we wszystkich blokach w niej
zadeklarowanych (dlatego działają clouseres)
5) Funkcja fmt.Println
jest dostępna jako wyeksportowana nazwa będąca w zasięgu
pakietu fmt