A Go nem objektum-orientált nyelv, hanem procedurális, azonban a mai programozói világ nagy része objektum-orientált paradigmát követi, amely használatára a Go is lehetőséget ad. Azonban amint majd láthatjuk a Go egy más gondolkodásmódot követ más megszokott objektum elvű nyelvekkel szemben.
A Go nem rendelkezik osztályokkal. Azokhoz legközelebb a struct típusuk állnak és ezekkel fogjuk megvalósítani a típusainkat.
Mint azt a struct
okról szóló fejezetben láthattuk a struct
ok tartalmazhatnak adattagokat. A struct
okhoz ezen felül műveletek is rendelhetők metódusok formájában. A metódusok deklarációja nagyon hasonló a függvények deklarációjához, a különbség csupán annyi, hogy meg kell határoznunk a hozzá kötődő típust a func
kulcsszó után. Ezt a következőképpen tehetjük meg:
Ezzel a metódusdefinícióval a my_type
nevű típusunkhoz rendeltünk egy my_func
nevű paraméter nélküli műveletet int
visszatérési értékkel. Az objektumpéldányt a deklarációban megadott „m” névvel érhetjük el. A metódus meghívása a „.” operátor segítségével történik egy my_type
egy példányból. A metódust egy struct
ra mutató pointer típushoz is rendelhetjük, azonban az ilyen függvényt nem érhetjük el egy statikus példányból:
Metódusokat struct
okon kívül bármilyen type
kulcsszóval definiált típushoz definiálhatunk. A szabály az, hogy csak a lokális csomagunkban lévő típusokra definiálhatunk metódusokat:
Azonban ez a szabály megkerülhető új saját típus definiálásával:
Ahogy a struct
ok leírásánál láthattuk, hogy ez a típus hasonlít leginkább az osztály fogalmára. Láthattuk továbbá azt is, hogy lehetőséget ad a nyelv beágyazásra. A beágyazás megvalósítása anonim mezők deklarálásával történik a struct
on belül. Ezt felhasználhatjuk az öröklődés megvalósításához. Beágyazás után elérhetővé válik a beágyazott struct
minden metódusa és minden mezője a külső struct
számára is:
Ebben a példában láthatjuk, hogy mind az Aston Martin és a Ferrari is autóként viselkedik – mivel mindkettő számára elérhető a numOfWheels
metódus a Car struct
ból. Továbbá mind a kettő definiálja a saját viselkedését is, amit csak ő használhat.
A beágyazásnak segítségével megvalósítható a többszörös öröklődés is, mivel a nyelv nem korlátozza le az anonim mezők számát egy struct
on belül. Így egyszerre több más struct
videlkedését is implementálhatjuk egy általunk definiáltban.
A példánkban szerepel egy Camera
és egy Phone
típus amelyekből leszármazik a CameraPhone
típus amely megvalósítja mind a Camera
, mind a Phone
típus műveleteit.
Más programozási nyelvekben a láthatóság jelölésére megtalálhatunk olyan kulcsszavakat, mint public, private, package, protected
stb. melyek segítségével a fejlesztő jelölheti az adattagok láthatóságát. Go erre egy teljesen más megközelítést használ. A nyelvben két féle láthatóság található: csak csomagon belül láthatóság vagy csomagon belüli és kívüli láthatóság. A Go-ban erre nem találhatóak kulcsszavak ehelyett a következőképpen jelöljük: minden kis betűvel kezdődő struct
vagy változó csak csomagon belüli, minden nagy betűvel kezdődő változó vagy struct
pedig csomagon belüli és kívüli láthatóságot kap. Így nincs szükség a változó visszakeresésére, amint ránézünk a nevére tudjuk annak láthatóságát. Más nyelvek ezt konvencióként alkalmazzák, a Go azonban kényszeríti a fejlesztőt ennek használatára.
Mivel a Go-ban nincs hierarchia, nem tudunk alosztályokat megvalósítani. Azonban a polimorfizmus és annak előnyei itt is megtalálhatóak, melyet interfészek segítségével valósítunk meg. Ha különböző típusú objektumok egy azonos metódusát szeretnénk meghívni egy erre definiált interfész segítségével megtehetjük: