|
| 1 | +# 2.4 struct |
| 2 | + |
| 3 | +## struct |
| 4 | + |
| 5 | +Diğer programlama dillerinde olduğu gibi, Go'daki diğer özelliklerin veya alanların yeni tür konteynerlerini tanımlayabiliriz. Örneğin, bir kişiyi temsil etmek için alan adı ve yaşıyla birlikte `kişi` adında bir tür oluşturabiliriz. Bu türleri `struct` olarak adlandırıyoruz. |
| 6 | +```Go |
| 7 | +type kisi struct { |
| 8 | + name string |
| 9 | + age int |
| 10 | +} |
| 11 | +``` |
| 12 | +`Struct` yapısını tanımlamanın ne kadar kolay olduğuna bir bakın! |
| 13 | + |
| 14 | +İki alan var. |
| 15 | + |
| 16 | +- `name` bir kişinin ismini saklamak için kullanılan bir `string` yapısıdır. |
| 17 | +- `age` bir kişinin yaşını saklamak için kullanılan bir `int` yapısıdır. |
| 18 | + |
| 19 | +Nasıl kullanıldığını görelim. |
| 20 | +```Go |
| 21 | +type person struct { |
| 22 | + name string |
| 23 | + age int |
| 24 | +} |
| 25 | + |
| 26 | +var P person // p person tipi |
| 27 | + |
| 28 | +P.name = "Astaxie" // p'nin `name` alanına "Astaxie" atayın |
| 29 | +P.age = 25 // p'nin `age` alanına 25 atayın |
| 30 | +fmt.Printf("The person's name is %s\n", P.name) // p'nin `name` alanını ekrana yazdırın |
| 31 | +``` |
| 32 | +Bir struct'ı başlatmanın üç yolu daha var. |
| 33 | + |
| 34 | +- İlk değerleri siparişe göre atama |
| 35 | +```Go |
| 36 | +P := person{"Tom", 25} |
| 37 | +``` |
| 38 | +- Struct'ı sırasız başlatmak için `field:value` biçimini kullanın |
| 39 | +```Go |
| 40 | +P := person{age:24, name:"Bob"} |
| 41 | +``` |
| 42 | +- Anonim bir struct tanımladıktan sonra başlatın |
| 43 | +```Go |
| 44 | +P := struct{name string; age int}{"Amy",18} |
| 45 | +``` |
| 46 | +Tamamlanmış bir örnek görelim. |
| 47 | + |
| 48 | +```Go |
| 49 | +package main |
| 50 | + |
| 51 | +import "fmt" |
| 52 | + |
| 53 | +// yeni bir tür tanımlama |
| 54 | +type person struct { |
| 55 | + name string |
| 56 | + age int |
| 57 | +} |
| 58 | + |
| 59 | +// struct değere göre geçildi |
| 60 | +// iki insanın yaşını karşılaştırır, sonra yaşlı olanı ve yaş farkını getirir. |
| 61 | +func Older(p1, p2 person) (person, int) { |
| 62 | + if p1.age > p2.age { |
| 63 | + return p1, p1.age - p2.age |
| 64 | + } |
| 65 | + return p2, p2.age - p1.age |
| 66 | +} |
| 67 | + |
| 68 | +func main() { |
| 69 | + var tom person |
| 70 | + |
| 71 | + tom.name, tom.age = "Tom", 18 |
| 72 | + bob := person{age: 25, name: "Bob"} |
| 73 | + paul := person{"Paul", 43} |
| 74 | + |
| 75 | + tb_Older, tb_diff := Older(tom, bob) |
| 76 | + tp_Older, tp_diff := Older(tom, paul) |
| 77 | + bp_Older, bp_diff := Older(bob, paul) |
| 78 | + |
| 79 | + fmt.Printf("Of %s and %s, %s is older by %d years\n", tom.name, bob.name, tb_Older.name, tb_diff) |
| 80 | + fmt.Printf("Of %s and %s, %s is older by %d years\n", tom.name, paul.name, tp_Older.name, tp_diff) |
| 81 | + fmt.Printf("Of %s and %s, %s is older by %d years\n", bob.name, paul.name, bp_Older.name, bp_diff) |
| 82 | +} |
| 83 | +``` |
| 84 | +### yapıya gömülü alanlar |
| 85 | + |
| 86 | +Daha önce alan adlarıyla ve türleriyle bir struct tanımlamayı öğrendik. Aslında Go alanları adları olmayan ancak türleriyle destekler. Bu gömülü alanları diyoruz. |
| 87 | + |
| 88 | +Gömülü alan bir struct olduğunda, o struct'taki tüm alanlar gömülü olduğu struct içindeki alanlar olacaktır. |
| 89 | + |
| 90 | +Bir örnek görelim. |
| 91 | +```Go |
| 92 | +package main |
| 93 | + |
| 94 | +import "fmt" |
| 95 | + |
| 96 | +type Human struct { |
| 97 | + name string |
| 98 | + age int |
| 99 | + weight int |
| 100 | +} |
| 101 | + |
| 102 | +type Student struct { |
| 103 | + Human // gömülü alan Studen struct'ı Human'ın sahip olduğu tüm alanları içerir. |
| 104 | + specialty string |
| 105 | +} |
| 106 | + |
| 107 | +func main() { |
| 108 | + // öğrenciyi somutlaştırın ve başlatın. |
| 109 | + mark := Student{Human{"Mark", 25, 120}, "Computer Science"} |
| 110 | + |
| 111 | + // erişim alanları |
| 112 | + fmt.Println("His name is ", mark.name) |
| 113 | + fmt.Println("His age is ", mark.age) |
| 114 | + fmt.Println("His weight is ", mark.weight) |
| 115 | + fmt.Println("His specialty is ", mark.specialty) |
| 116 | + |
| 117 | + // mark'ın uzmanlık alanını değiştirin |
| 118 | + mark.specialty = "AI" |
| 119 | + fmt.Println("Mark changed his specialty") |
| 120 | + fmt.Println("His specialty is ", mark.specialty) |
| 121 | + |
| 122 | + fmt.Println("Mark become old. He is not an athlete anymore") |
| 123 | + mark.age = 46 |
| 124 | + mark.weight += 60 |
| 125 | + fmt.Println("His age is", mark.age) |
| 126 | + fmt.Println("His weight is", mark.weight) |
| 127 | +} |
| 128 | + |
| 129 | +``` |
| 130 | + |
| 131 | + |
| 132 | +Şekil 2.7 Student'a ve Human'a Gömme |
| 133 | + |
| 134 | +Human'da olduğu gibi Student'taki `age` ve `name` alanlarına erişebildiğimizi görüyoruz. Bu gömülü alanların çalışma şeklidir. Çok havalı değil mi? Bekle, daha havalı bir şey var! Bu gömülü alanda Human'a erişmek için Student bile kullanabilirsin! |
| 135 | +```Go |
| 136 | +mark.Human = Human{"Marcus", 55, 220} |
| 137 | +mark.Human.age -= 1 |
| 138 | +``` |
| 139 | +Go'daki tüm türler gömülü alanlar olarak kullanılabilir. |
| 140 | +```Go |
| 141 | +package main |
| 142 | + |
| 143 | +import "fmt" |
| 144 | + |
| 145 | +type Skills []string |
| 146 | + |
| 147 | +type Human struct { |
| 148 | + name string |
| 149 | + age int |
| 150 | + weight int |
| 151 | +} |
| 152 | + |
| 153 | +type Student struct { |
| 154 | + Human // gömülü alan olarak struct |
| 155 | + Skills // gömülü alan olarak string dilimi |
| 156 | + int // gömülü alan olarak yerleşik tür |
| 157 | + specialty string |
| 158 | +} |
| 159 | + |
| 160 | +func main() { |
| 161 | + // Student Jane'i başlat |
| 162 | + jane := Student{Human: Human{"Jane", 35, 100}, specialty: "Biology"} |
| 163 | + // erişim alanı |
| 164 | + fmt.Println("Her name is ", jane.name) |
| 165 | + fmt.Println("Her age is ", jane.age) |
| 166 | + fmt.Println("Her weight is ", jane.weight) |
| 167 | + fmt.Println("Her specialty is ", jane.specialty) |
| 168 | + // beceri alanının değerini değiştir |
| 169 | + jane.Skills = []string{"anatomy"} |
| 170 | + fmt.Println("Her skills are ", jane.Skills) |
| 171 | + fmt.Println("She acquired two new ones ") |
| 172 | + jane.Skills = append(jane.Skills, "physics", "golang") |
| 173 | + fmt.Println("Her skills now are ", jane.Skills) |
| 174 | + // gömülü alanı değiştir |
| 175 | + jane.int = 3 |
| 176 | + fmt.Println("Her preferred number is ", jane.int) |
| 177 | +} |
| 178 | + |
| 179 | +``` |
| 180 | +Yukarıdaki örnekte, tüm türlerin gömülü alanlar olabileceğini görebilir ve üzerinde çalışmak için işlevleri kullanabiliriz. |
| 181 | + |
| 182 | +Ancak bir sorun daha var. Human'ın `phone` adında bir alanı varsa ve Student'ta aynı adı taşıyan bir alan varsa ne yapmalıyız? |
| 183 | + |
| 184 | +Hadi çözmek için çok basit bir yol kullan. Dış alanlar daha yüksek erişim seviyelerine sahip olur, yani “student.phone” 'a eriştiğinizde, Human struct'ında değil Student olarak telefon denilen alanı elde ederiz. Bu özellik basitçe alan `aşırı yüklemesi` olarak görülebilir. |
| 185 | +```Go |
| 186 | +package main |
| 187 | + |
| 188 | +import "fmt" |
| 189 | + |
| 190 | +type Human struct { |
| 191 | + name string |
| 192 | + age int |
| 193 | + phone string // Human bir telefon alanına sahip |
| 194 | +} |
| 195 | + |
| 196 | +type Employee struct { |
| 197 | + Human |
| 198 | + specialty string |
| 199 | + phone string // çalışan telefon |
| 200 | +} |
| 201 | + |
| 202 | +func main() { |
| 203 | + Bob := Employee{Human{"Bob", 34, "777-444-XXXX"}, "Designer", "333-222"} |
| 204 | + |
| 205 | + fmt.Println("Bob's work phone is:", Bob.phone) |
| 206 | + fmt.Println("Bob's personal phone is:", Bob.Human.phone) |
| 207 | +} |
| 208 | + |
| 209 | +``` |
| 210 | +## Links |
| 211 | + |
| 212 | +- [Rehber](preface.md) |
| 213 | +- Önceki bölüm: [Kontrol ifadeleri ve fonksiyonlar](02.3.md) |
| 214 | +- Sonraki bölüm: [Object-oriented](02.5.md) |
0 commit comments