merge conflict error fixed

This commit is contained in:
Emre
2018-01-12 21:28:50 +03:00
parent b6e7b62f0f
commit 052ca2a390

View File

@@ -13,31 +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` şartları için Go da paranteze gerek yoktur.
if x > 10 { if x > 10 {
<<<<<<< HEAD
fmt.Println("x 10'dan büyüktür") fmt.Println("x 10'dan büyüktür")
} else { } else {
fmt.Println("x 10'dan küçük veya eşittir") fmt.Println("x 10'dan küçük veya eşittir")
=======
fmt.Println("x is greater than 10")
} else {
fmt.Println("x is less than or equal to 10")
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
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. 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 // x'i tanımla, ve 10 dan büyük olup olmadığını kontrol et
<<<<<<< HEAD
if x := islenenDeger(); x > 10 { if x := islenenDeger(); x > 10 {
fmt.Println("x 10'dan büyüktür") fmt.Println("x 10'dan büyüktür")
} else { } else {
fmt.Println("x 10'dan küçüktür") fmt.Println("x 10'dan küçüktür")
=======
if x := computedValue(); x > 10 {
fmt.Println("x is greater than 10")
} else {
fmt.Println("x is less than 10")
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
// Bu satır derlenemez // Bu satır derlenemez
@@ -45,21 +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. Birden fazla şart için `if-else` kullanın.
<<<<<<< HEAD
if sayı == 3 { if sayı == 3 {
fmt.Println("Sayı 3'e eşittir") fmt.Println("Sayı 3'e eşittir")
} else if integer < 3 { } else if integer < 3 {
fmt.Println("Sayı 3'ten küçüktür") fmt.Println("Sayı 3'ten küçüktür")
} else { } else {
fmt.Println("Sayı 3'ten büyüktür") fmt.Println("Sayı 3'ten büyüktür")
=======
if integer == 3 {
fmt.Println("The integer is equal to 3")
} else if integer < 3 {
fmt.Println("The integer is less than 3")
} else {
fmt.Println("The integer is greater than 3")
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
### goto ### goto
@@ -68,17 +46,10 @@ Go da `goto` terimi mevcuttur fakat kullanırken dikkatli olun. `goto` programı
func myFunc() { func myFunc() {
i := 0 i := 0
<<<<<<< HEAD
Buraya: // label sonuna ":" koyulur Buraya: // label sonuna ":" koyulur
fmt.Println(i) fmt.Println(i)
i++ i++
goto Buraya // "Buraya" labeline git goto Buraya // "Buraya" labeline git
=======
Here: // label ends with ":"
fmt.Println(i)
i++
goto Here // jump to label "Here"
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
Label'ın adı büyük-küçük harfe duyarlıdır. Label'ın adı büyük-küçük harfe duyarlıdır.
@@ -87,19 +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` Go da bulunan en güçlü kontrol lojiğidir. Datayı döngüsel olarak ve tekrarlı işlemlerle okuyabilir, `while` döngüsü gibi.
<<<<<<< HEAD
for ifade1; ifade2; ifade3 { for ifade1; ifade2; ifade3 {
//... //...
} }
`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. `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.
=======
for expression1; expression2; expression3 {
//...
}
`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.
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
Örnekler düz yazıdan daha yararlı olacaktır. Örnekler düz yazıdan daha yararlı olacaktır.
@@ -107,7 +70,6 @@ Label'ın adı büyük-küçük harfe duyarlıdır.
import "fmt" import "fmt"
func main(){ func main(){
<<<<<<< HEAD
toplam := 0; toplam := 0;
for index:=0; index < 10 ; index++ { for index:=0; index < 10 ; index++ {
toplam += index toplam += index
@@ -123,85 +85,43 @@ Bazen birden fazla atama yapmak gerekir fakat Go bunun için kullanılacak bir `
toplam := 1 toplam := 1
for ; toplam < 1000; { for ; toplam < 1000; {
toplam += toplam toplam += toplam
=======
sum := 0;
for index:=0; index < 10 ; index++ {
sum += index
}
fmt.Println("sum is equal to ", sum)
}
// Printsum is equal to 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.
sum := 1
for ; sum < 1000; {
sum += sum
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
Hatta `;` bile çıkarılabilir. Tanıdık geldi mi? Evet, tamamen `while` gibi oldu. Hatta `;` bile çıkarılabilir. Tanıdık geldi mi? Evet, tamamen `while` gibi oldu.
<<<<<<< HEAD
toplam := 1 toplam := 1
for toplam < 1000 { for toplam < 1000 {
toplam += toplam toplam += toplam
=======
sum := 1
for sum < 1000 {
sum += sum
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
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. 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-- { for index := 10; index>0; index-- {
if index == 5{ if index == 5{
<<<<<<< HEAD
break // veya continue break // veya continue
} }
fmt.Println(index) fmt.Println(index)
} }
// break varsa yazılanlar: 10、9、8、7、6 // break varsa yazılanlar: 10、9、8、7、6
// continue varsa yazılanlar: 10、9、8、7、6、4、3、2、1 // continue varsa yazılanlar: 10、9、8、7、6、4、3、2、1
=======
break // or continue
}
fmt.Println(index)
}
// break prints 10、9、8、7、6
// continue prints 10、9、8、7、6、4、3、2、1
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
`for` döngüsü `range` kullanıldığında `slice` ve `map` de bulunan datayı okuyabilir. `for` döngüsü `range` kullanıldığında `slice` ve `map` de bulunan datayı okuyabilir.
for k,v:=range map { for k,v:=range map {
<<<<<<< HEAD
fmt.Println("map'in k anahtarı:", k) fmt.Println("map'in k anahtarı:", k)
fmt.Println("map'in k anahtarındaki değeri:", v) fmt.Println("map'in k anahtarındaki değeri:", v)
=======
fmt.Println("map's key:",k)
fmt.Println("map's val:",v)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
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. 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{ for _, v := range map{
<<<<<<< HEAD
fmt.Println("map'in değeri:", v) fmt.Println("map'in değeri:", v)
=======
fmt.Println("map's val:", v)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
### switch ### 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. 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.
<<<<<<< HEAD
switch anaIfade { switch anaIfade {
case ifade1: case ifade1:
// eşleşme olursa işlenecek kod // eşleşme olursa işlenecek kod
@@ -211,17 +131,6 @@ Bazı durumlarda çok fazla `if-else` kullandığınızı farkedebilirsiniz. Bu
// eşleşme olursa işlenecek kod // eşleşme olursa işlenecek kod
default: default:
// eşleşme olmazsa işlenecek kod // eşleşme olmazsa işlenecek kod
=======
switch sExpr {
case expr1:
some instructions
case expr2:
some other instructions
case expr3:
some other instructions
default:
other code
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
`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. `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.
@@ -229,7 +138,6 @@ Bazı durumlarda çok fazla `if-else` kullandığınızı farkedebilirsiniz. Bu
i := 10 i := 10
switch i { switch i {
case 1: case 1:
<<<<<<< HEAD
fmt.Println("i 1'e eşittir") fmt.Println("i 1'e eşittir")
case 2, 3, 4: case 2, 3, 4:
fmt.Println("i 2, 3 veya 4'e eşittir") fmt.Println("i 2, 3 veya 4'e eşittir")
@@ -237,20 +145,10 @@ Bazı durumlarda çok fazla `if-else` kullandığınızı farkedebilirsiniz. Bu
fmt.Println("i 10'a eşittir") fmt.Println("i 10'a eşittir")
default: default:
fmt.Println("Tek bildiğim i nin bir sayi olduğu") fmt.Println("Tek bildiğim i nin bir sayi olduğu")
=======
fmt.Println("i is equal to 1")
case 2, 3, 4:
fmt.Println("i is equal to 2, 3 or 4")
case 10:
fmt.Println("i is equal to 10")
default:
fmt.Println("All I know is that i is an integer")
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
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. 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.
<<<<<<< HEAD
sayı := 6 sayı := 6
switch sayı { switch sayı {
case 4: case 4:
@@ -287,59 +185,14 @@ Programın sonucu şu olacaktır.
// fonksiyon gövdesi // fonksiyon gövdesi
// birden fazla return // birden fazla return
return dönüş1, dönüş2 return dönüş1, dönüş2
=======
integer := 6
switch integer {
case 4:
fmt.Println("integer <= 4")
fallthrough
case 5:
fmt.Println("integer <= 5")
fallthrough
case 6:
fmt.Println("integer <= 6")
fallthrough
case 7:
fmt.Println("integer <= 7")
fallthrough
case 8:
fmt.Println("integer <= 8")
fallthrough
default:
fmt.Println("default case")
}
This program prints the following information.
integer <= 6
integer <= 7
integer <= 8
default case
## Functions
`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
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları bulunur. Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları bulunur.
<<<<<<< HEAD
- `fonksiyonAdı` 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 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. - Fonksiyonlar birden fazla değer döndürebilirler.
- 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. - 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.
=======
- `funcName` 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.
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
- Eğer sadece bir değer döndürecekseniz parantez olmadan yazmalısınız. - 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. - Eğer en az bir değer döndürüyorsanız, fonksiyonun içinde istediğiniz yerde `return` terimini kullanmalısınız.
@@ -348,11 +201,7 @@ Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları b
package main package main
import "fmt" import "fmt"
<<<<<<< HEAD
// a ile b arasından büyük olanı döndür // a ile b arasından büyük olanı döndür
=======
// return greater value between a and b
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
func max(a, b int) int { func max(a, b int) int {
if a > b { if a > b {
return a return a
@@ -365,21 +214,12 @@ Yukarıdaki örnekten tahmin edebileceğiniz üzere aşağıda açıklamaları b
y := 4 y := 4
z := 5 z := 5
<<<<<<< HEAD
max_xy := max(x, y) // max(x, y) fonskiyonunu çağır max_xy := max(x, y) // max(x, y) fonskiyonunu çağır
max_xz := max(x, z) // max(x, z) fonksiyonunu ç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, y, max_xy)
fmt.Printf("max(%d, %d) = %d\n", x, z, max_xz) fmt.Printf("max(%d, %d) = %d\n", x, z, max_xz)
fmt.Printf("max(%d, %d) = %d\n", y, z, max(y,z)) // burada da fonksiyon çağırıldı fmt.Printf("max(%d, %d) = %d\n", y, z, max(y,z)) // burada da fonksiyon çağırıldı
=======
max_xy := max(x, y) // call function max(x, y)
max_xz := max(x, z) // call function max(x, z)
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
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
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. 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.
@@ -393,13 +233,8 @@ Alttaki örnekte bunu kullanalım.
package main package main
import "fmt" import "fmt"
<<<<<<< HEAD
// A+B ve A*B nin sonuçlarını döndür // A+B ve A*B nin sonuçlarını döndür
func toplaVeCarp(A, B int) (int, int) { func toplaVeCarp(A, B int) (int, int) {
=======
// return results of A + B and A * B
func SumAndProduct(A, B int) (int, int) {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
return A+B, A*B return A+B, A*B
} }
@@ -407,30 +242,17 @@ Alttaki örnekte bunu kullanalım.
x := 3 x := 3
y := 4 y := 4
<<<<<<< HEAD
xARTIy, xCARPIy := SumAndProduct(x, y) xARTIy, xCARPIy := SumAndProduct(x, y)
fmt.Printf("%d + %d = %d\n", x, y, xARTIy) fmt.Printf("%d + %d = %d\n", x, y, xARTIy)
fmt.Printf("%d * %d = %d\n", x, y, xCARPIy) fmt.Printf("%d * %d = %d\n", x, y, xCARPIy)
=======
xPLUSy, xTIMESy := SumAndProduct(x, y)
fmt.Printf("%d + %d = %d\n", x, y, xPLUSy)
fmt.Printf("%d * %d = %d\n", x, y, xTIMESy)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
Ü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. Ü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.
<<<<<<< HEAD
func ToplaVeCarp(A, B int) (toplanan int, carpılan int) { func ToplaVeCarp(A, B int) (toplanan int, carpılan int) {
toplanan = A+B toplanan = A+B
carpılan = A*B carpılan = A*B
=======
func SumAndProduct(A, B int) (add int, multiplied int) {
add = A+B
multiplied = A*B
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
return return
} }
@@ -443,11 +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. `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 { for _, n := range arg {
<<<<<<< HEAD
fmt.Printf("Sayı: %d\n", n) fmt.Printf("Sayı: %d\n", n)
=======
fmt.Printf("And the number is: %d\n", n)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
### Değer ile devretmek ve pointerlar ### Değer ile devretmek ve pointerlar
@@ -459,23 +277,15 @@ Bunun kanıtı olarak bir örnek görelim.
package main package main
import "fmt" import "fmt"
<<<<<<< HEAD
// a ya 1 eklemek için basit bir fonksiyon // a ya 1 eklemek için basit bir fonksiyon
func birEkle(a int) int { func birEkle(a int) int {
a = a+1 // a'nın değeri değişti a = a+1 // a'nın değeri değişti
return a // a'nın yeni değeri döndürülüyor return a // a'nın yeni değeri döndürülüyor
=======
// 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
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
func main() { func main() {
x := 3 x := 3
<<<<<<< HEAD
fmt.Println("x = ", x) // sonuç "x = 3" olmalı fmt.Println("x = ", x) // sonuç "x = 3" olmalı
x1 := birEkle(x) // birEkle(x) fonksiyonu çağırıldı x1 := birEkle(x) // birEkle(x) fonksiyonu çağırıldı
@@ -491,58 +301,25 @@ Sebebi basit: `birEkle` i çağırdığımızda ona `x` in bir kopyasını gönd
Şimdi sorabilirsiniz `x` in kendisini nasıl fonksiyona verebilirim diye. Ş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 `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. 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.
=======
fmt.Println("x = ", x) // should print "x = 3"
x1 := add1(x) // call add1(x)
fmt.Println("x+1 = ", x1) // should print "x+1 = 4"
fmt.Println("x = ", x) // should print "x = 3"
}
Gördünüz mü? `add1` 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.
Ş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.
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
package main package main
import "fmt" import "fmt"
<<<<<<< HEAD
// a ya 1 eklemek için basit bir fonksiyon // a ya 1 eklemek için basit bir fonksiyon
func birEkle(a *int) int { func birEkle(a *int) int {
*a = *a+1 // a'nın değeri değişti *a = *a+1 // a'nın değeri değişti
return *a // a'nın yeni değeri döndürülüyor return *a // a'nın yeni değeri döndürülüyor
=======
// 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
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
func main() { func main() {
x := 3 x := 3
<<<<<<< HEAD
fmt.Println("x = ", x) // sonuç "x = 3" olmalı fmt.Println("x = ", x) // sonuç "x = 3" olmalı
x1 := add1(&x) // birEkle(x) fonksiyonu çağırıldı ve x'in adresi verildi x1 := add1(&x) // birEkle(x) fonksiyonu çağırıldı ve x'in adresi verildi
fmt.Println("x+1 = ", x1) // sonuç "x+1 = 4" olmalı fmt.Println("x+1 = ", x1) // sonuç "x+1 = 4" olmalı
fmt.Println("x = ", x) // sonuç "x = 4" olmalı fmt.Println("x = ", x) // sonuç "x = 4" olmalı
=======
fmt.Println("x = ", x) // should print "x = 3"
x1 := add1(&x) // call add1(&x) pass memory address of x
fmt.Println("x+1 = ", x1) // should print "x+1 = 4"
fmt.Println("x = ", x) // should print "x = 4"
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
Şimdi `x` in asıl değerini değiştirebiliriz. Neden pointer kullanıyoruz? Avantajı nedir? Şimdi `x` in asıl değerini değiştirebiliriz. Neden pointer kullanıyoruz? Avantajı nedir?
@@ -555,26 +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. 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.
<<<<<<< HEAD
func OkuYaz() bool { func OkuYaz() bool {
file.Open("dosya") file.Open("dosya")
// Kod // Kod
if hataX { if hataX {
=======
func ReadWrite() bool {
file.Open("file")
// Do some work
if failureX {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
file.Close() file.Close()
return false return false
} }
<<<<<<< HEAD
if hataY { if hataY {
=======
if failureY {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
file.Close() file.Close()
return false return false
} }
@@ -585,7 +351,6 @@ 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. 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.
<<<<<<< HEAD
func OkuYaz() bool { func OkuYaz() bool {
file.Open("dosya") file.Open("dosya")
defer file.Close() defer file.Close()
@@ -593,15 +358,6 @@ Bazı kodların tekrar ettiğini görüyoruz. `defer` bu problemi çok iyi çöz
return false return false
} }
if hataY { if hataY {
=======
func ReadWrite() bool {
file.Open("file")
defer file.Close()
if failureX {
return false
}
if failureY {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
return false return false
} }
return true return true
@@ -617,46 +373,29 @@ 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. 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.
<<<<<<< HEAD
type türAdı func(parametre1 tür1, parametre2 tür2 [, ...]) (çıkış1 tür1 [, ...]) type türAdı func(parametre1 tür1, parametre2 tür2 [, ...]) (çıkış1 tür1 [, ...])
=======
type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
Bunun avantajı nedir? Cevap, fonksiyonları değer olarak verebilmemizi sağlamasıdır. Bunun avantajı nedir? Cevap, fonksiyonları değer olarak verebilmemizi sağlamasıdır.
package main package main
import "fmt" import "fmt"
<<<<<<< HEAD
type testInt func(int) bool // değişken olarak fonksiyon tanımlandı type testInt func(int) bool // değişken olarak fonksiyon tanımlandı
func tekMi(sayı int) bool { func tekMi(sayı int) bool {
if sayı%2 == 0 { if sayı%2 == 0 {
=======
type testInt func(int) bool // define a function type of variable
func isOdd(integer int) bool {
if integer%2 == 0 {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
return false return false
} }
return true return true
} }
<<<<<<< HEAD
func çiftMi(sayı int) bool { func çiftMi(sayı int) bool {
if sayı%2 == 0 { if sayı%2 == 0 {
=======
func isEven(integer int) bool {
if integer%2 == 0 {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
return true return true
} }
return false return false
} }
<<<<<<< HEAD
// 'f' fonksiyonunu bir fonksiyona parametre olarak ata // 'f' fonksiyonunu bir fonksiyona parametre olarak ata
func filtre(slice []int, f testInt) []int { func filtre(slice []int, f testInt) []int {
@@ -667,24 +406,11 @@ Bunun avantajı nedir? Cevap, fonksiyonları değer olarak verebilmemizi sağlam
} }
} }
return sonuc return sonuc
=======
// pass the function `f` as an argument to another function
func filter(slice []int, f testInt) []int {
var result []int
for _, value := range slice {
if f(value) {
result = append(result, value)
}
}
return result
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
func main(){ func main(){
slice := []int {1, 2, 3, 4, 5, 7} slice := []int {1, 2, 3, 4, 5, 7}
fmt.Println("slice = ", slice) fmt.Println("slice = ", slice)
<<<<<<< HEAD
tek := filtre(slice, tekMi) // fonksiyonu değer olarak kullan tek := filtre(slice, tekMi) // fonksiyonu değer olarak kullan
fmt.Println("Slice'daki tek sayılar: ", tek) fmt.Println("Slice'daki tek sayılar: ", tek)
çift := filtre(slice, çiftMi) çift := filtre(slice, çiftMi)
@@ -692,15 +418,6 @@ Bunun avantajı nedir? Cevap, fonksiyonları değer olarak verebilmemizi sağlam
} }
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. 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.
=======
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)
}
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.
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
### Panic ve Recover ### Panic ve Recover
@@ -712,39 +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. Aşağıdaki örnekte `panic` nasıl kullanılır gösterilmiştir.
<<<<<<< HEAD
var kullanıcı = os.Getenv("KULLANICI") var kullanıcı = os.Getenv("KULLANICI")
func init() { func init() {
if kullanıcı == "" { if kullanıcı == "" {
panic("$KULLANICI için bir değer bulunamadı") panic("$KULLANICI için bir değer bulunamadı")
=======
var user = os.Getenv("USER")
func init() {
if user == "" {
panic("no value for $USER")
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
} }
} }
Bu örnek de `panic` kontrolü yapılmasını gösterir. Bu örnek de `panic` kontrolü yapılmasını gösterir.
<<<<<<< HEAD
func panicYapar(f func()) (b bool) { func panicYapar(f func()) (b bool) {
=======
func throwsPanic(f func()) (b bool) {
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
defer func() { defer func() {
if x := recover(); x != nil { if x := recover(); x != nil {
b = true b = true
} }
}() }()
<<<<<<< HEAD
f() // eğer f() panic yaparsa recover yapılır f() // eğer f() panic yaparsa recover yapılır
=======
f() // if f causes panic, it will recover
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
return return
} }
@@ -758,11 +459,7 @@ Programlar işleme `main` paketinden başlar. Eğer `main` başka paketler dahil
![](images/2.3.init.png?raw=true) ![](images/2.3.init.png?raw=true)
<<<<<<< HEAD
Şekil 2.6 Go da programların parafe edilmesinin akışı Şekil 2.6 Go da programların parafe edilmesinin akışı
=======
Figure 2.6 Go da programların parafe edilmesinin akışı
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
### import ### import
@@ -813,15 +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. 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.
<<<<<<< HEAD
## Linkler ## Linkler
- [Rehber](preface.md) - [Rehber](preface.md)
- Önceki bölüm: [Go temelleri](02.2.md) - Önceki bölüm: [Go temelleri](02.2.md)
=======
## Links
- [Directory](preface.md)
- Önceki bölüm: [Go foundation](02.2.md)
>>>>>>> eead24cf064976b648de5826eab51880c803b0fa
- Sonraki bölüm: [struct](02.4.md) - Sonraki bölüm: [struct](02.4.md)