Structs
Struct ifadeleri veri alanları ve bunlara ait benzersiz özellikleri barındıran koleksiyon kitapçıklarıdır. Bir veri tipinin hangi şablona göre yerleştirileceğini gösteren yapılardır. Eğer nesne yönelimli programlama bilginiz varsa bu konuda kısaca struct yapıları object yani nesne oluşturmak için geliştirilmiş yapılardır denilebilir.
OOP - Object Oriented Programming : Nesneler benzersiz ve belirleyici özellikler içeren bir değerler kümesidir. Nesneler çağrılabilir, nesneye ait nitelikler işlemlere dahil edilebilir ve bir nesne şablonundan farklı nesneler yaratılabilir. Programlama yapıları içerisinde Nesne Tabanlı programlama öğeleri içeren bu yapılara OOP ismi verilir.
İlk örneğimizle struct yapısını ve çalışma mantığını inceleyelim:
type Coordinates struct {
Lat float64 // latitude
Long float64 // longitude
PlaceName string
}
func main() {
fmt.Println(Coordinates{
Lat: 41.67805,
Long: 26.55914,
PlaceName: "Selimiye Camii",
})
}
Yukarıdaki örneğimizde Coordinates isimli bir struct ifadesi tanımladık. Bu ifade Lat, Long, PlaceName ifadeleri içerir. Bu struct şablonuna bağlı olarak sonsuz miktarda Lat, Long, PlaceName içeren nesne tanımlanabilir. Örneğimizde Edirne Selimiye Camii koordinatlarını içeren bir nesne tanımladık. Kodumuzu çağırdığımızda ekran çıktımız aşağıdaki şekilde olacaktır.
{41.67805 26.55914 Selimiye Camii}
Aşağıda selimiye isimli bir nesne object tanımlamasını Coordinates struct yapısına bağlı olarak tanımladık. selimiye bu sayede eşsiz bir nesne haline geldi. Yalnızca Lat, Long, PlaceName değişkenlerini alabilen ve belirtilen değerlere sahip bir nesne olarak programın herhangi bir noktasından çağrılabilir hale geldi.
func main(){
fmt.Println(Coordinates{
Lat: 41.67805,
Long: 26.55914,
PlaceName: "Selimiye Camii",
})
// Coordinates yapısına bağlı selimiye isimli bir nesne tanımladık
selimiye := Coordinates{
Lat: 41.67805,
Long: 26.55914,
PlaceName: "Selimiye Camii",
}
// selimiye nesnesinin özellikleri teker teker çağrılabilir
fmt.Println(selimiye.Lat)
fmt.Println(selimiye.Long)
fmt.Println(selimiye.PlaceName)
}
Bu kod bloğu çalıştırıldığında aşağıdaki gibi bir çıktı elde ederiz.
{41.67805 26.55914 Selimiye Camii}
41.67805
26.55914
Selimiye Camii
struct ifadeleri primitive veri tipleri olan int, float, bool, string gibi değerler alabildikleri gibi kompleks veri tipleri olan array, slice, map, func,struct gibi yapıları da alabilirler. Yani bir struct ifadesi başka bir struct ifadesinin bir öğesi olabilir.
func main(){
type City struct {
CityName []string
}
type Province struct {
Cities City
population int
}
trakyaCity := City{CityName: []string{"Kirklareli",
"Edirne",
"Tekirdağ",
"Çanakkale",
"Istanbul"}}
trakya := Province{
Cities: trakyaCity,
population: 19500000,
}
fmt.Println(trakya)
fmt.Println(trakya.Cities)
}
Yukarıdaki örnekte City isimli struct ifadesinin CityName isimli özelliğini bir slice olarak tanımladık. City isimli struct ifadesini de Province isimli başka bir struct ifadesinin Cities isimli özelliğine atadık. Bu ifade çalıştırıldığında ise aşağıdaki çıktıyı ekranda görüntüleyeceğiz:
{{[Kirklareli Edirne Tekirdağ Çanakkale Istanbul]} 19500000}
{[Kirklareli Edirne Tekirdağ Çanakkale Istanbul]}