Translated code examples for 02.3.md to Turkish
This commit is contained in:
260
tr/02.3.md
260
tr/02.3.md
@@ -13,18 +13,18 @@ Akış kontrolü programcılıkta en büyük icattır. Onun sayesinde, basit kon
|
||||
`if` şartları için Go da paranteze gerek yoktur.
|
||||
|
||||
if x > 10 {
|
||||
fmt.Println("x is greater than 10")
|
||||
fmt.Println("x 10'dan büyüktür")
|
||||
} else {
|
||||
fmt.Println("x is less than or equal to 10")
|
||||
fmt.Println("x 10'dan küçük veya eşittir")
|
||||
}
|
||||
|
||||
Go da çok işe yarar bir `if` kullanımı, şart ifadesinden önce değişken tanımlama yapmaktır. Bu değişkenin kapsamı sadece `if` blok alanı içerisinde geçerlidir.
|
||||
|
||||
// x'i tanımla, ve 10 dan büyük olup olmadığını kontrol et
|
||||
if x := computedValue(); x > 10 {
|
||||
fmt.Println("x is greater than 10")
|
||||
if x := islenenDeger(); x > 10 {
|
||||
fmt.Println("x 10'dan büyüktür")
|
||||
} else {
|
||||
fmt.Println("x is less than 10")
|
||||
fmt.Println("x 10'dan küçüktür")
|
||||
}
|
||||
|
||||
// Bu satır derlenemez
|
||||
@@ -32,12 +32,12 @@ Go da çok işe yarar bir `if` kullanımı, şart ifadesinden önce değişken t
|
||||
|
||||
Birden fazla şart için `if-else` kullanın.
|
||||
|
||||
if integer == 3 {
|
||||
fmt.Println("The integer is equal to 3")
|
||||
if sayı == 3 {
|
||||
fmt.Println("Sayı 3'e eşittir")
|
||||
} else if integer < 3 {
|
||||
fmt.Println("The integer is less than 3")
|
||||
fmt.Println("Sayı 3'ten küçüktür")
|
||||
} else {
|
||||
fmt.Println("The integer is greater than 3")
|
||||
fmt.Println("Sayı 3'ten büyüktür")
|
||||
}
|
||||
|
||||
### goto
|
||||
@@ -46,10 +46,10 @@ Go da `goto` terimi mevcuttur fakat kullanırken dikkatli olun. `goto` programı
|
||||
|
||||
func myFunc() {
|
||||
i := 0
|
||||
Here: // label ends with ":"
|
||||
Buraya: // label sonuna ":" koyulur
|
||||
fmt.Println(i)
|
||||
i++
|
||||
goto Here // jump to label "Here"
|
||||
goto Buraya // "Buraya" labeline git
|
||||
}
|
||||
|
||||
Label'ın adı büyük-küçük harfe duyarlıdır.
|
||||
@@ -58,11 +58,11 @@ Label'ın adı büyük-küçük harfe duyarlıdır.
|
||||
|
||||
`for` Go da bulunan en güçlü kontrol lojiğidir. Datayı döngüsel olarak ve tekrarlı işlemlerle okuyabilir, `while` döngüsü gibi.
|
||||
|
||||
for expression1; expression2; expression3 {
|
||||
for ifade1; ifade2; ifade3 {
|
||||
//...
|
||||
}
|
||||
|
||||
`expression1`, `expression2` ve `expression3` birer ifade olmak üzere, `expression1` ve `expression3` değişken tanımlama veya bir fonksiyondan dönen return olabilirken, `expression2` ise kontrol ifadesidir. `expression1` ifadesi döngüye girmeden önce bir kere işlenecektir. `expression3` ise her döngü sonunda işlenir.
|
||||
`ifade1`, `ifade2` ve `ifade3` birer ifade olmak üzere, `ifade1` ve `ifade3` değişken tanımlama veya bir fonksiyondan dönen değer olabilirken, `ifade2` ise kontrol ifadesidir. `ifade1` ifadesi döngüye girmeden önce bir kere işlenecektir. `ifade3` ise her döngü sonunda işlenir.
|
||||
|
||||
Örnekler düz yazıdan daha yararlı olacaktır.
|
||||
|
||||
@@ -70,67 +70,67 @@ Label'ın adı büyük-küçük harfe duyarlıdır.
|
||||
import "fmt"
|
||||
|
||||
func main(){
|
||||
sum := 0;
|
||||
toplam := 0;
|
||||
for index:=0; index < 10 ; index++ {
|
||||
sum += index
|
||||
toplam += index
|
||||
}
|
||||
fmt.Println("sum is equal to ", sum)
|
||||
fmt.Println("sayıların toplamı= ", toplam)
|
||||
}
|
||||
// Print:sum is equal to 45
|
||||
// Ekran çıktısı:sayıların toplamı= 45
|
||||
|
||||
Bazen birden fazla atama yapmak gerekir fakat Go bunun için kullanılacak bir `,` operatörü yoktur. Biz de `i, j = i + 1, j - 1` gibi paralel atamalar yaparız.
|
||||
|
||||
İhtiyacımız yoksa `expression1` ve `expression1` ifadelerini çıkarabiliriz.
|
||||
İhtiyaç yoksa `ifade1` ve `ifade3` çıkartılabilir.
|
||||
|
||||
sum := 1
|
||||
for ; sum < 1000; {
|
||||
sum += sum
|
||||
toplam := 1
|
||||
for ; toplam < 1000; {
|
||||
toplam += toplam
|
||||
}
|
||||
|
||||
Hatta `;` bile çıkarılabilir. Tanıdık geldi mi? Evet, tamamen `while` gibi oldu.
|
||||
|
||||
sum := 1
|
||||
for sum < 1000 {
|
||||
sum += sum
|
||||
toplam := 1
|
||||
for toplam < 1000 {
|
||||
toplam += toplam
|
||||
}
|
||||
|
||||
Döngülerde `break` ve `continue` adında iki önemli işlem vardır. `break` döngüden çıkartır ve `continue` o anki tekrarı atlar ve sonraki tekrara geçer. Eğer birden fazla iç içe döngüleriniz varsa `break` ile labelları kullabilirsiniz.
|
||||
|
||||
for index := 10; index>0; index-- {
|
||||
if index == 5{
|
||||
break // or continue
|
||||
break // veya continue
|
||||
}
|
||||
fmt.Println(index)
|
||||
}
|
||||
// break prints 10、9、8、7、6
|
||||
// continue prints 10、9、8、7、6、4、3、2、1
|
||||
// break varsa yazılanlar: 10、9、8、7、6
|
||||
// continue varsa yazılanlar: 10、9、8、7、6、4、3、2、1
|
||||
|
||||
`for` döngüsü `range` kullanıldığında `slice` ve `map` de bulunan datayı okuyabilir.
|
||||
|
||||
for k,v:=range map {
|
||||
fmt.Println("map's key:",k)
|
||||
fmt.Println("map's val:",v)
|
||||
fmt.Println("map'in k anahtarı:", k)
|
||||
fmt.Println("map'in k anahtarındaki değeri:", v)
|
||||
}
|
||||
|
||||
Go da birden fazla değer return yapılabildiği ve kullanılmayan bir değişken olduğunda derleyici hata verdiği için, kullanmak istemediğiniz değişkenler için `_` kullanabilirsiniz.
|
||||
|
||||
for _, v := range map{
|
||||
fmt.Println("map's val:", v)
|
||||
fmt.Println("map'in değeri:", v)
|
||||
}
|
||||
|
||||
### switch
|
||||
|
||||
Bazı durumlarda çok fazla `if-else` kullandığınızı farkedebilirsiniz. Bu programı okumayı zorlaştırır ve gelecekte bakım yapmayı zorlaştırabilir. Bu durumda problemi çözmek için `switch` kullanmak mükemmeldir.
|
||||
|
||||
switch sExpr {
|
||||
case expr1:
|
||||
some instructions
|
||||
case expr2:
|
||||
some other instructions
|
||||
case expr3:
|
||||
some other instructions
|
||||
switch anaIfade {
|
||||
case ifade1:
|
||||
// eşleşme olursa işlenecek kod
|
||||
case ifade2:
|
||||
// eşleşme olursa işlenecek kod
|
||||
case ifade3:
|
||||
// eşleşme olursa işlenecek kod
|
||||
default:
|
||||
other code
|
||||
// eşleşme olmazsa işlenecek kod
|
||||
}
|
||||
|
||||
`sExpr`, `expr1`, `expr2`, ve `expr3` ifadelerinin türleri aynı olmalıdır. `switch` çok esnektir. Şartlar sabit olmak zorunda değildir ve şart sağlanana kadar yukarıdan aşağıya doğru çalışır. Eğer `switch` in ardından bir ifade gelmiyorsa `true` olarak görülür.
|
||||
@@ -138,61 +138,61 @@ Bazı durumlarda çok fazla `if-else` kullandığınızı farkedebilirsiniz. Bu
|
||||
i := 10
|
||||
switch i {
|
||||
case 1:
|
||||
fmt.Println("i is equal to 1")
|
||||
fmt.Println("i 1'e eşittir")
|
||||
case 2, 3, 4:
|
||||
fmt.Println("i is equal to 2, 3 or 4")
|
||||
fmt.Println("i 2, 3 veya 4'e eşittir")
|
||||
case 10:
|
||||
fmt.Println("i is equal to 10")
|
||||
fmt.Println("i 10'a eşittir")
|
||||
default:
|
||||
fmt.Println("All I know is that i is an integer")
|
||||
fmt.Println("Tek bildiğim i nin bir sayi olduğu")
|
||||
}
|
||||
|
||||
Beşinci satırdaki gibi `case` içinde birden fazla değer olabilir. `case` sonlarına `break` eklemeye gerek yoktur, şart sağlanıp işlem yapıldıktan sonra çıkacaktır. Eğer çıkmasını istemiyorsanız `fallthrough` ifadesini kullanarak bir sonraki şarta devam edebilirsiniz.
|
||||
|
||||
integer := 6
|
||||
switch integer {
|
||||
sayı := 6
|
||||
switch sayı {
|
||||
case 4:
|
||||
fmt.Println("integer <= 4")
|
||||
fmt.Println("sayı <= 4")
|
||||
fallthrough
|
||||
case 5:
|
||||
fmt.Println("integer <= 5")
|
||||
fmt.Println("sayı <= 5")
|
||||
fallthrough
|
||||
case 6:
|
||||
fmt.Println("integer <= 6")
|
||||
fmt.Println("sayı <= 6")
|
||||
fallthrough
|
||||
case 7:
|
||||
fmt.Println("integer <= 7")
|
||||
fmt.Println("sayı <= 7")
|
||||
fallthrough
|
||||
case 8:
|
||||
fmt.Println("integer <= 8")
|
||||
fmt.Println("sayı <= 8")
|
||||
fallthrough
|
||||
default:
|
||||
fmt.Println("default case")
|
||||
fmt.Println("default durumu")
|
||||
}
|
||||
|
||||
This program prints the following information.
|
||||
Programın sonucu şu olacaktır.
|
||||
|
||||
integer <= 6
|
||||
integer <= 7
|
||||
integer <= 8
|
||||
default case
|
||||
sayı <= 6
|
||||
sayı <= 7
|
||||
sayı <= 8
|
||||
default durumu
|
||||
|
||||
## Functions
|
||||
## Fonksiyonlar
|
||||
|
||||
`func` terimini kullanarak bir fonksiyon tanımlayın.
|
||||
|
||||
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
|
||||
// function body
|
||||
// multi-value return
|
||||
return value1, value2
|
||||
func fonksiyonAdı(parametre1 tür1, parametre2 tür2) (çıkış1 tür1, çıkış2 tür2) {
|
||||
// fonksiyon gövdesi
|
||||
// birden fazla return
|
||||
return dönüş1, dönüş2
|
||||
}
|
||||
|
||||
Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları bulunur.
|
||||
|
||||
- `funcName` adlı foonksiyonu tanımlamak için `func` terimini kullanın.
|
||||
- `fonksiyonAdı` adlı foonksiyonu tanımlamak için `func` terimini kullanın.
|
||||
- Fonksiyonlar sıfır veya daha fazla parametreye sahip olabilir. Parametrenin türü adından sonra gelir ve birden fazla parametre varsa `,` ile ayrılır.
|
||||
- Fonksiyonlar birden fazla değer döndürebilirler.
|
||||
- Bu örnekte `output1` ve `output2` adında iki değer döndürülmüş. Bunlara ad vermek zorunda değilsiniz, türünü yazmanız yeterli.
|
||||
- Bu örnekte `çıkış1` ve `çıkış2` adında iki değer döndürülmüş. Bunlara ad vermek zorunda değilsiniz, türünü yazmanız yeterli.
|
||||
- Eğer sadece bir değer döndürecekseniz parantez olmadan yazmalısınız.
|
||||
- Eğer en az bir değer döndürüyorsanız, fonksiyonun içinde istediğiniz yerde `return` terimini kullanmalısınız.
|
||||
|
||||
@@ -201,7 +201,7 @@ Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları b
|
||||
package main
|
||||
import "fmt"
|
||||
|
||||
// return greater value between a and b
|
||||
// a ile b arasından büyük olanı döndür
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
@@ -214,12 +214,12 @@ Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları b
|
||||
y := 4
|
||||
z := 5
|
||||
|
||||
max_xy := max(x, y) // call function max(x, y)
|
||||
max_xz := max(x, z) // call function max(x, z)
|
||||
max_xy := max(x, y) // max(x, y) fonskiyonunu çağır
|
||||
max_xz := max(x, z) // max(x, z) fonksiyonunu çağır
|
||||
|
||||
fmt.Printf("max(%d, %d) = %d\n", x, y, max_xy)
|
||||
fmt.Printf("max(%d, %d) = %d\n", x, z, max_xz)
|
||||
fmt.Printf("max(%d, %d) = %d\n", y, z, max(y,z)) // call function here
|
||||
fmt.Printf("max(%d, %d) = %d\n", y, z, max(y,z)) // burada da fonksiyon çağırıldı
|
||||
}
|
||||
|
||||
Yukarıdaki örnek fonksiyon `max` da iki aynı tür parametre `int` olduğu için bir tane yazmak yeterli olur. Yani `a int, b int` yerine `a, b int` kullanılır. Birden fazla parametre için de aynı kural geçerlidir. Farkettiyseniz `max` fonksiyonu sadece bir değer döndürür ve zorunda olmadığımız için o değere bir isim vermedik, bu kısa halini kullandık.
|
||||
@@ -233,8 +233,8 @@ Alttaki örnekte bunu kullanalım.
|
||||
package main
|
||||
import "fmt"
|
||||
|
||||
// return results of A + B and A * B
|
||||
func SumAndProduct(A, B int) (int, int) {
|
||||
// A+B ve A*B nin sonuçlarını döndür
|
||||
func toplaVeCarp(A, B int) (int, int) {
|
||||
return A+B, A*B
|
||||
}
|
||||
|
||||
@@ -242,17 +242,17 @@ Alttaki örnekte bunu kullanalım.
|
||||
x := 3
|
||||
y := 4
|
||||
|
||||
xPLUSy, xTIMESy := SumAndProduct(x, y)
|
||||
xARTIy, xCARPIy := SumAndProduct(x, y)
|
||||
|
||||
fmt.Printf("%d + %d = %d\n", x, y, xPLUSy)
|
||||
fmt.Printf("%d * %d = %d\n", x, y, xTIMESy)
|
||||
fmt.Printf("%d + %d = %d\n", x, y, xARTIy)
|
||||
fmt.Printf("%d * %d = %d\n", x, y, xCARPIy)
|
||||
}
|
||||
|
||||
Üstteki fonksiyon isimsiz iki değer döndürür -isterseniz isim verebilirsiniz. Eğer isimlendirseydik, `return` yazıp isimlerini yazmamız yeterdi. Çünkü fonksiyonun içinde tanımlılar. Şuna dikkat etmelisiniz ki eğer fonksiyonu başka bir pakette kullanacaksanız (fonksiyonun ilk harfi büyük harfle başlamalıdır) `return` yapacaklarınızı tam bir ifade olarak yazmanız daha iyi olacaktır. Kodu daha okunur hale getirir.
|
||||
|
||||
func SumAndProduct(A, B int) (add int, multiplied int) {
|
||||
add = A+B
|
||||
multiplied = A*B
|
||||
func ToplaVeCarp(A, B int) (toplanan int, carpılan int) {
|
||||
toplanan = A+B
|
||||
carpılan = A*B
|
||||
return
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ Go birden fazla argüman alabilen fonksiyonları destekler. Bunlara variadic (be
|
||||
`arg …int` kısmı Go ya bu fonksiyonun değişen sayıda argüman aldığını söyler. Bu argümanların türü `int` dir. `arg` fonksiyonun gövdesinde `int` türünde bir `slice` olur.
|
||||
|
||||
for _, n := range arg {
|
||||
fmt.Printf("And the number is: %d\n", n)
|
||||
fmt.Printf("Sayı: %d\n", n)
|
||||
}
|
||||
|
||||
### Değer ile devretmek ve pointerlar
|
||||
@@ -277,49 +277,49 @@ Bunun kanıtı olarak bir örnek görelim.
|
||||
package main
|
||||
import "fmt"
|
||||
|
||||
// simple function to add 1 to a
|
||||
func add1(a int) int {
|
||||
a = a+1 // we change value of a
|
||||
return a // return new value of a
|
||||
// a ya 1 eklemek için basit bir fonksiyon
|
||||
func birEkle(a int) int {
|
||||
a = a+1 // a'nın değeri değişti
|
||||
return a // a'nın yeni değeri döndürülüyor
|
||||
}
|
||||
|
||||
func main() {
|
||||
x := 3
|
||||
|
||||
fmt.Println("x = ", x) // should print "x = 3"
|
||||
fmt.Println("x = ", x) // sonuç "x = 3" olmalı
|
||||
|
||||
x1 := add1(x) // call add1(x)
|
||||
x1 := birEkle(x) // birEkle(x) fonksiyonu çağırıldı
|
||||
|
||||
fmt.Println("x+1 = ", x1) // should print "x+1 = 4"
|
||||
fmt.Println("x = ", x) // should print "x = 3"
|
||||
fmt.Println("x+1 = ", x1) // sonuç "x+1 = 4" olmalı
|
||||
fmt.Println("x = ", x) // sonuç "x = 3" olmalı
|
||||
}
|
||||
|
||||
Gördünüz mü? `add1` fonksiyonuna `x` i gönderdiğimiz halde asıl değeri değişmedi.
|
||||
Gördünüz mü? `birEkle` fonksiyonuna `x` i gönderdiğimiz halde asıl değeri değişmedi.
|
||||
|
||||
Sebebi basit: `add1` i çağırdığımızda ona `x` in bir kopyasını gönderdik `x` in kendisini değil.
|
||||
Sebebi basit: `birEkle` i çağırdığımızda ona `x` in bir kopyasını gönderdik `x` in kendisini değil.
|
||||
|
||||
Şimdi sorabilirsiniz `x` in kendisini nasıl fonksiyona verebilirim diye.
|
||||
|
||||
Burada pointer kullanmamız gerekiyor. Biliyoruz ki değişkenler bellekte tutulur ve bir adresleri vardır. Eğer değişkenin aslını değiştirmek istiyorsak onun bellek adresini kullanmalıyız. Böylelikle `add1` fonksiyonu `x` in adresini kullanarak onun değerini değiştirebilir. Parametre türünü `*int` olarak değiştiriyoruz ve değişkenin adresini `&x` ile fonksiyona veriyoruz. Fonksiyona değerin bir kopyasını değil de bir pointer verdiğimize dikkat edin.
|
||||
Burada pointer kullanmamız gerekiyor. Biliyoruz ki değişkenler bellekte tutulur ve bir adresleri vardır. Eğer değişkenin aslını değiştirmek istiyorsak onun bellek adresini kullanmalıyız. Böylelikle `birEkle` fonksiyonu `x` in adresini kullanarak onun değerini değiştirebilir. Parametre türünü `*int` olarak değiştiriyoruz ve değişkenin adresini `&x` ile fonksiyona veriyoruz. Fonksiyona değerin bir kopyasını değil de bir pointer verdiğimize dikkat edin.
|
||||
|
||||
package main
|
||||
import "fmt"
|
||||
|
||||
// simple function to add 1 to a
|
||||
func add1(a *int) int {
|
||||
*a = *a+1 // we changed value of a
|
||||
return *a // return new value of a
|
||||
// a ya 1 eklemek için basit bir fonksiyon
|
||||
func birEkle(a *int) int {
|
||||
*a = *a+1 // a'nın değeri değişti
|
||||
return *a // a'nın yeni değeri döndürülüyor
|
||||
}
|
||||
|
||||
func main() {
|
||||
x := 3
|
||||
|
||||
fmt.Println("x = ", x) // should print "x = 3"
|
||||
fmt.Println("x = ", x) // sonuç "x = 3" olmalı
|
||||
|
||||
x1 := add1(&x) // call add1(&x) pass memory address of x
|
||||
x1 := add1(&x) // birEkle(x) fonksiyonu çağırıldı ve x'in adresi verildi
|
||||
|
||||
fmt.Println("x+1 = ", x1) // should print "x+1 = 4"
|
||||
fmt.Println("x = ", x) // should print "x = 4"
|
||||
fmt.Println("x+1 = ", x1) // sonuç "x+1 = 4" olmalı
|
||||
fmt.Println("x = ", x) // sonuç "x = 4" olmalı
|
||||
}
|
||||
|
||||
Şimdi `x` in asıl değerini değiştirebiliriz. Neden pointer kullanıyoruz? Avantajı nedir?
|
||||
@@ -332,15 +332,15 @@ Burada pointer kullanmamız gerekiyor. Biliyoruz ki değişkenler bellekte tutul
|
||||
|
||||
Go da iyi tasarlanmış `defer` (ertelemek) adlı bir terim vardır. Bir fonksiyonda birden fazla `defer` ifadesi bulunabilir, program çalıştığında sondan başa sırayla çalışacaklardır. Programın dosya açtığı durumlarda bu dosyaların hata vermeden önce kapatılması gerekir. Örneklere bakalım.
|
||||
|
||||
func ReadWrite() bool {
|
||||
file.Open("file")
|
||||
// Do some work
|
||||
if failureX {
|
||||
func OkuYaz() bool {
|
||||
file.Open("dosya")
|
||||
// Kod
|
||||
if hataX {
|
||||
file.Close()
|
||||
return false
|
||||
}
|
||||
|
||||
if failureY {
|
||||
if hataY {
|
||||
file.Close()
|
||||
return false
|
||||
}
|
||||
@@ -351,13 +351,13 @@ Go da iyi tasarlanmış `defer` (ertelemek) adlı bir terim vardır. Bir fonksiy
|
||||
|
||||
Bazı kodların tekrar ettiğini görüyoruz. `defer` bu problemi çok iyi çözer. Daha temiz kod yazmanıza yardım etmekle kalmaz kodunuzu daha okunur yapar.
|
||||
|
||||
func ReadWrite() bool {
|
||||
file.Open("file")
|
||||
func OkuYaz() bool {
|
||||
file.Open("dosya")
|
||||
defer file.Close()
|
||||
if failureX {
|
||||
if hataX {
|
||||
return false
|
||||
}
|
||||
if failureY {
|
||||
if hataY {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
@@ -373,51 +373,51 @@ Eğer birden fazla `defer` varsa ters sırayla çalışırlar. Sıradaki örnek
|
||||
|
||||
Go'da fonksiyonlar aynı zamanda değişken olabilirler. `type` onları kullanarak tanımlayabiliriz. Aynı imzaya sahip fonksiyonlar ayno tür olarak görülebilir.
|
||||
|
||||
type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])
|
||||
type türAdı func(parametre1 tür1, parametre2 tür2 [, ...]) (çıkış1 tür1 [, ...])
|
||||
|
||||
Bunun avantajı nedir? Cevap, fonksiyonları değer olarak verebilmemizi sağlamasıdır.
|
||||
|
||||
package main
|
||||
import "fmt"
|
||||
|
||||
type testInt func(int) bool // define a function type of variable
|
||||
type testInt func(int) bool // değişken olarak fonksiyon tanımlandı
|
||||
|
||||
func isOdd(integer int) bool {
|
||||
if integer%2 == 0 {
|
||||
func tekMi(sayı int) bool {
|
||||
if sayı%2 == 0 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func isEven(integer int) bool {
|
||||
if integer%2 == 0 {
|
||||
func çiftMi(sayı int) bool {
|
||||
if sayı%2 == 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// pass the function `f` as an argument to another function
|
||||
// 'f' fonksiyonunu bir fonksiyona parametre olarak ata
|
||||
|
||||
func filter(slice []int, f testInt) []int {
|
||||
var result []int
|
||||
for _, value := range slice {
|
||||
if f(value) {
|
||||
result = append(result, value)
|
||||
func filtre(slice []int, f testInt) []int {
|
||||
var sonuc []int
|
||||
for _, deger := range slice {
|
||||
if f(deger) {
|
||||
sonuc = append(sonuc, deger)
|
||||
}
|
||||
}
|
||||
return result
|
||||
return sonuc
|
||||
}
|
||||
|
||||
func main(){
|
||||
slice := []int {1, 2, 3, 4, 5, 7}
|
||||
fmt.Println("slice = ", slice)
|
||||
odd := filter(slice, isOdd) // use function as values
|
||||
fmt.Println("Odd elements of slice are: ", odd)
|
||||
even := filter(slice, isEven)
|
||||
fmt.Println("Even elements of slice are: ", even)
|
||||
tek := filtre(slice, tekMi) // fonksiyonu değer olarak kullan
|
||||
fmt.Println("Slice'daki tek sayılar: ", tek)
|
||||
çift := filtre(slice, çiftMi)
|
||||
fmt.Println("Slice'daki çift sayılar: ", çift)
|
||||
}
|
||||
|
||||
Interface kullanılan durumlarda çok yararlıdır. Gördüğünüz gibi `testInt` fonksiyon türünde bir değişkendir ve `filter` ın döndürdüğü argümanlar ve değerler `testInt` ile aynıdır. Böylelikle programlarımızda karmaşık mantık yürütebilir ve esneklik kazanabiliriz.
|
||||
Interface kullanılan durumlarda çok yararlıdır. Gördüğünüz gibi `testInt` fonksiyon türünde bir değişkendir ve `filtre`'nin döndürdüğü argümanlar ve değerler `testInt` ile aynıdır. Böylelikle programlarımızda karmaşık mantık yürütebilir ve esneklik kazanabiliriz.
|
||||
|
||||
### Panic ve Recover
|
||||
|
||||
@@ -429,23 +429,23 @@ Go da Java gibi `try-catch` yapısı yoktur. Go exception fırlatmak yerine `pan
|
||||
|
||||
Aşağıdaki örnekte `panic` nasıl kullanılır gösterilmiştir.
|
||||
|
||||
var user = os.Getenv("USER")
|
||||
var kullanıcı = os.Getenv("KULLANICI")
|
||||
|
||||
func init() {
|
||||
if user == "" {
|
||||
panic("no value for $USER")
|
||||
if kullanıcı == "" {
|
||||
panic("$KULLANICI için bir değer bulunamadı")
|
||||
}
|
||||
}
|
||||
|
||||
Bu örnek de `panic` kontrolü yapılmasını gösterir.
|
||||
|
||||
func throwsPanic(f func()) (b bool) {
|
||||
func panicYapar(f func()) (b bool) {
|
||||
defer func() {
|
||||
if x := recover(); x != nil {
|
||||
b = true
|
||||
}
|
||||
}()
|
||||
f() // if f causes panic, it will recover
|
||||
f() // eğer f() panic yaparsa recover yapılır
|
||||
return
|
||||
}
|
||||
|
||||
@@ -459,7 +459,7 @@ Programlar işleme `main` paketinden başlar. Eğer `main` başka paketler dahil
|
||||
|
||||

|
||||
|
||||
Figure 2.6 Go da programların parafe edilmesinin akışı
|
||||
Şekil 2.6 Go da programların parafe edilmesinin akışı
|
||||
|
||||
### import
|
||||
|
||||
@@ -510,8 +510,8 @@ Paketler dahil edilirken kullanılan özel operatörler vardır ve bunlar geneld
|
||||
|
||||
Bu operatör dahil edilen paketin sadece `init` fonksiyonun çağrılıp çalıştırılması için kullanılır. Paketteki diğer fonksiyonları kullanacağınıza emin değilseniz kullanabilirsiniz.
|
||||
|
||||
## Links
|
||||
## Linkler
|
||||
|
||||
- [Directory](preface.md)
|
||||
- Önceki bölüm: [Go foundation](02.2.md)
|
||||
- [Rehber](preface.md)
|
||||
- Önceki bölüm: [Go temelleri](02.2.md)
|
||||
- Sonraki bölüm: [struct](02.4.md)
|
||||
|
||||
Reference in New Issue
Block a user