DEV Community

Aydın Yakar
Aydın Yakar

Posted on • Updated on

Golang 101: Yapılar (Structs)

Yapı struct nesne benzeri gruplama için kullanılır. Bir çok alanda kullanılırlar örn database işlemlerinde, json/xml çıktılarında vb.

package main

import "fmt"

// Yapı
type Ogrenci struct {
    ad    string
    soyad string
    yas   int
    sinif string
}

// İç içe Yapılar
type Laptop struct {
    islemci    string
    ekranKarti string
    disk       string
    ram        int
}
type Uretici struct {
    firma  string
    model  string
    Laptop // yapı
}

func main() {

    // Boş yapı oluşturma
    ogr := new(Ogrenci)
    fmt.Println(ogr)

    // Yapıya Değer Atama
    fmt.Println(Ogrenci{"Aydın", "Yakar", 40, "3A"})

    // Yapıya alan adları ile birlikte değer atama
    fmt.Println(Ogrenci{ad: "Hasan", soyad: "Ünsal", yas: 45, sinif: "5C"})

    // Boş alanlar ile değer atama
    fmt.Println(Ogrenci{ad: "Osman"})

    // Yapıdaki değeri yazdırma
    o := Ogrenci{ad: "Hüseyin", yas: 20}
    fmt.Println(o.ad)

    // Yapıyı işaretçi ile kullanmak
    ogrenci := &o
    fmt.Println(ogrenci.ad)

    // İşaret edilen yapıda değişiklik yapılabilir
    ogrenci.yas = 22
    fmt.Println(ogrenci.yas)

    // İşaretçi ile belirtilen değişkenlerin değerleri işaret edilen değişkenin adresidir
    fmt.Println("o değişkeni:", &o, "\nogrenci degişkeni:", &ogrenci)

    // Gömülü yapılar
    laptop := Laptop{islemci: "i7 8750h", ekranKarti: "GTX 1060", disk: "250 gb m2 SSD", ram: 16}
    uretici := Uretici{firma: "Monster Notebook", model: "Tulpar T5 v17.1", Laptop: laptop}
    fmt.Println(laptop, uretici)
}

Enter fullscreen mode Exit fullscreen mode
&{  0 }
{Aydın Yakar 40 3A}
{Hasan Ünsal 45 5C}
{Osman  0 }
Hüseyin
Hüseyin
22
o değişkeni: &{Hüseyin  22 } 
ogrenci degişkeni: 0xc00000e030
{i7 8750h GTX 1060 250 gb m2 SSD 16} {Monster Notebook Tulpar T5 v17.1 {i7 8750h GTX 1060 250 gb m2 SSD 16}}
Enter fullscreen mode Exit fullscreen mode

çalıştır

Yapı Tanımlama

type Ogrenci struct {
    ad string
    soyad string
    yas  int
    sinif string
}
Enter fullscreen mode Exit fullscreen mode

Yapı tanımları struct anahtar kelimesi ile yapılır. Ardından alanların türleri girilmelidir.

İç içe Yapılar

type Laptop struct {
    islemci string
    ekranKarti string
    disk string
    ram int
}
type Uretici struct {
    firma string
    model string
    Laptop // yapı
}
Enter fullscreen mode Exit fullscreen mode

Eğer iç içe yapılar olacak ise eklenen yapı için tür belirtecine gerek yoktur. Eğer dizi olarak atanacak ise laptop []Laptop şeklinde de belirtilebilir.

    laptop   := Laptop{islemci: "i7 8750h", ekranKarti: "GTX 1060", disk: "250 gb m2 SSD", ram: 16}
    uretici  := Uretici{firma: "Monster Notebook", model: "Tulpar T5 v17.1", Laptop: laptop}
    fmt.Println(laptop, uretici)
Enter fullscreen mode Exit fullscreen mode

Boş Yapı Oluşturma

    ogr := new(Ogrenci)
Enter fullscreen mode Exit fullscreen mode

Boş bir yapı oluşturmak için new() fonksiyonu kullanılır. Tüm değerler boş/sıfır (zero-valued) olacaktır.

Yapıya Değer Atama Yöntemleri

    // Yapıya Değer Atama
    fmt.Println(Ogrenci{"Aydın", "Yakar", 40, "3A"})

    // Yapıya alan adları ile birlikte değer atama
    fmt.Println(Ogrenci{ad: "Hasan", soyad: "Ünsal", yas: 45, sinif: "5C"})

    // Boş alanlar ile değer atama
    fmt.Println(Ogrenci{ad: "Osman"})
Enter fullscreen mode Exit fullscreen mode

Yukarıda 3 farklı değer atama yöntemi görülmektedir. İlkinde sırasıyla değerler belirtilmiştir, ikinci yöntemde ise alan adları belirtilmiştir fakat istenirse sırası değiştirilerek de belirtilebilir. Son yöntem ise sadece ad atanmış, diğer alanlar boş bırakılmıştır.

Yapıdaki Değeri Yazdırma

    o := Ogrenci{ad: "Hüseyin", yas: 20}
    fmt.Println(o.ad)
Enter fullscreen mode Exit fullscreen mode

Değişken.alan şeklinde erişim sağlanabilmektedir.

Yapıyı İşaretçi ile Kullanmak

    ogrenci := &o
    fmt.Println(ogrenci.ad)

    // İşaret edilen yapıda değişiklik yapılabilir
    ogrenci.yas = 22
    fmt.Println(ogrenci.yas)
Enter fullscreen mode Exit fullscreen mode

Değişkeni işaretçi pointer ile farklı bir değişkene atayabilirsiniz. Fakat unutulmaması gereken aslında ogrenci değişkeninin sadece bir işaretçi olduğu yani o değişkeninin adresini barındırdığıdır. Yine de işaret edilen yapıda yapılan değişiklikler diğer değişkeni de değiştirmektedir. Karışık mı oldu? Örneğin aşağıdaki kısmını incelediğiniz de daha net oturacaktır.

    fmt.Println("o değişkeni:", &o, "\nogrenci degişkeni:", &ogrenci)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)