Kapak Fotoğrafı Tranmautritam

Şimdiye kadar Array, Slice ve Map‘ler dahil olmak üzere bir çok pratik ve faydalı veri tipinden bahsettik. Fakat bunlar her zaman ihtiyaçlarınıza tam karşılık vermeyebilirler. Go bu problemi “structures” kısa adıyla “struct” özel tipiyle çözüyor.

Array, Slice ve Map’ler her ne kadar çok pratik olsalar da farklı tiplerdeki değerleri gruplayarak saklamayı sağlayamıyorlar. Çeşitli değişkenleri gruplamak ve bunlardan yeni bir veri tipi oluşturmak için structure yapısını kullanabilirsiniz.

Struct’lara, bir önceki yazıda map tipi için kullandığımız örneği geliştirerek giriş yapabiliriz;

type student struct {
    name string
    mathGrade int
    lithGrade int
}

Bu kullanım nesne tabanlı programlama dillerindeki nesne yapısına benzse de Go’da nesne tabanlı bir yapı yoktur. Bu şekilde “ogrenci” adinda yeni bir tip tanımlamış olduk. Struct tipindeki bu değişkeni standart değişkenlerle benzer yöntemle oluşturup değer atayabiliriz.

// Değerleri struct'da yer aldıkları sırada verebiliriz

s1 := ogrenci{"Evren", 10, 8}

// veya

s1 := student{name:"Evren", mathGrade: 10}

struct içerisindeki bir değere ulaşmak veya değer atamak isterseniz nokta gösterimi ( dot notation ) kullanabilirsiniz.

Örneğin;

s1 := student{name: "Evren"}
s1.mathGrade = 10;
fmt.Print(s1.name, " adlı öğrencinin Matematik notu: ",s1.mathGrade ) 

Yukarıdaki örnekte görüldüğü gibi bir struct tanımlanırken hangi değerleirnin atanacağı isteğe bağlıdır ve tümünü belirtmediğiniz için hata almazsınız.

Daha gerçekçi bir başka struct örneği verirsek;

type Coord struct {
   X int
   Y int
   Z int
}

Örneğin Coord adında bir struct tanımlayarak, X,Y,Z koordinatlarını tutabiliriz.

type Player struct {
   name string
   start Coord
}

Bu struct’ı oluşuturduğumuz bir başka struct içerisinde dahi kullanabiliriz.

Oluşturduğumuz bu structları map, array veya slice değişkenleri içinde tutabiliriz.

students := [10]student{}

// veya

students := make(map[int]student)

Son olarak Struct ve Pointer tipinin birlikte kullanımına bir örnek verelim

package main

import "fmt"

type student struct {
    name string
    mathGrade int
    lithGrade int
}

func main() {
    student := student{name: "Evren", mathgrade: 10, lithGrade: 8}
    fmt.Println(student)
    studentCopy := &student
    studentCopy.name = "Huseyin"
    fmt.Println(student)
}

Bu kodu çalışıtrdığımızda şöyle bir sonuç alırız

{0 Evren 10 8}
{0 Huseyin 10 8 }

Pointer kullanarak studentCopy ile student değişkenlerini eşitlemiş, structımızı mutable bir hale getirmiş oluruz.

Strcut Gömme (Strcut Embedding)

Go’da structların içine bir başka struct gömebilir, gömdüğünüz structı tüm alanlarına yeni structınız içerisinden doğrudan ulaşabilirsiniz. Structların bu özelliği nesne tabanlı programlama dillerindeki ‘implementation’ ve ‘extension’ yapısına oldukça benziyor. Microsoft Learn’deki kod örneği ile inceleyelim;

package main

import "fmt"

type Person struct {
    ID        int
    FirstName string
    LastName  string
    Address   string
}

type Employee struct {
    Person
    ManagerID int
}

type Contractor struct {
    Person
    CompanyID int
}

func main() {
    employee := Employee{
        Person: Person{
            FirstName: "John",
        },
    }
    employee.LastName = "Doe"
    fmt.Println(employee.FirstName)
    employee.nameTell();
}

func (person *Person) nameTell() {
    fmt.Println(person.FirstName)
}

Yukarıdaki örnekte önce bir Person struct’ı oluşturduk ve bunu Contractor ve Employee Structlarının içine gömdük. İşin güzel tarafı Person Structının tüm alanlarına Employee ve Contractor structları içinden doğrudan ulaşabiliyoruz. Person structı içinde “FirstName” alanı doğrudan bulunmamasına rağmen Employee.Person.FirstName şeklinde uzunca bir kullanım yerine doğrudan Employee.FirstName kullanabiliyoruz. Benzer şekilde Person structına özel tanımladığımız nameTell fonkisyonunu da doğrudan employee üzerinde kullabiliyoruz. Bu iki özellik structları go’nun vazgeçilmez bir parçası haline getiriyor.

Structları daha detaylı anlatmak için biraz gerçek dünya örneğine ihtiyacımız var. Gelecekte yazacağım yazılarda bu örneklere yer vermeyi ümit ediyorum.

Bu Yazıda Yapılan Değişiklikler
  • 11.05.2022: Yazı özeti düzenlendi.