Skip to content

Commit f88ef5b

Browse files
authored
Merge pull request astaxie#1063 from ilteriskeskin/master
Added 02.4.md
2 parents 71d35e7 + f26e117 commit f88ef5b

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed

tr/02.4.md

+214
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
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+
![](images/2.4.student_struct.png?raw=true)
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

Comments
 (0)