Go Koşul Kontrolü
Go'da üç koşul kontrol ifadesi vardır: if, switch, select. select diğer ikisine göre daha özeldir, bu bölümde anlatılmayacak ve eşzamanlılık bölümünde ele alınacaktır.
if else
if else en fazla iki dallı判断 oluşturur, ifade formatı şöyledir:
if expression {
}veya
if expression {
}else {
}expression bir boolean ifade olmalıdır, yani sonuç ya doğru ya da yanlış olmalıdır, bir boolean değer olmalıdır. Örnek:
func main() {
a, b := 1, 2
if a > b {
b++
} else {
a++
}
}İfadesi daha karmaşık yazabilirsiniz, gerektiğinde okunabilirliği artırmak için parantez kullanarak hangisinin öncelikli olarak hesaplanacağını açıkça belirtmelisiniz.
func main() {
a, b := 1, 2
if a<<1%100+3 > b*100/20+6 { // (a<<1%100)+3 > (b*100/20)+6
b++
} else {
a++
}
}Ayrıca if ifadesi bazı basit ifadeler de içerebilir, örneğin:
func main() {
if x := 1 + 1; x > 2 {
fmt.Println(x)
}
}else if
else if ifadesi if else temelinde daha fazla判断 dallı oluşturabilir, ifade formatı şöyledir:
if expression1 {
}else if expression2 {
}else if expression3 {
}else {
}Çalışma sürecinde her ifadenin değerlendirmesi soldan sağa, tüm if ifadesinin değerlendirmesi yukarıdan aşağıya yapılır. Puana göre not veren bir örnek aşağıda, ilk yazım şekli:
func main() {
score := 90
var ans string
if score == 100 {
ans = "S"
} else if score >= 90 && score < 100 {
ans = "A"
} else if score >= 80 && score < 90 {
ans = "B"
} else if score >= 70 && score < 80 {
ans = "C"
} else if score >= 60 && score < 70 {
ans = "E"
} else if score >= 0 && score < 60 {
ans = "F"
} else {
ans = "nil"
}
fmt.Println(ans)
}İkinci yazım şekli if ifadesinin yukarıdan aşağıya değerlendirme yaptığını kullanır, bu nedenle kod daha öz olur.
func main() {
score := 90
var ans string
if score >= 0 && score < 60 {
ans = "F"
} else if score < 70 {
ans = "D"
} else if score < 80 {
ans = "C"
} else if score < 90 {
ans = "B"
} else if score < 100 {
ans = "A"
} else if score == 100 {
ans = "S"
}else {
ans = "nil"
}
fmt.Println(ans)
}switch
switch ifadesi de çok dallı bir判断 ifadesidir, ifade formatı şöyledir:
switch expr {
case case1:
statement1
case case2:
statement2
default:
default statement
}Basit bir örnek:
func main() {
str := "a"
switch str {
case "a":
str += "a"
str += "c"
case "b":
str += "bb"
str += "aaaa"
default: // Tüm case'ler eşleşmezse default dalı çalışır
str += "CCCC"
}
fmt.Println(str)
}İfade öncesinde bazı basit ifadeler de yazabilirsiniz, örneğin yeni değişken tanımlama:
func main() {
switch num := f(); { // switch num := f(); true ile eşdeğer
case num >= 0 && num <= 1:
num++
case num > 1:
num--
fallthrough
case num < 0:
num += num
}
}
func f() int {
return 1
}switch ifadesi giriş ifadesi olmadan da kullanılabilir.
func main() {
num := 2
switch { // switch true ile eşdeğer
case num >= 0 && num <= 1:
num++
case num > 1:
num--
case num < 0:
num *= num
}
fmt.Println(num)
}fallthrough anahtar kelimesi ile bir sonraki dalı çalıştırmaya devam edebilirsiniz.
func main() {
num := 2
switch {
case num >= 0 && num <= 1:
num++
case num > 1:
num--
fallthrough // Bu dalı çalıştırdıktan sonra bir sonraki dalı çalıştırmaya devam eder
case num < 0:
num += num
}
fmt.Println(num)
}label
Etiket ifadesi, bir kod bloğuna etiket koyar, goto, break, continue için hedef olabilir. Örnek:
func main() {
A:
a := 1
B:
b := 2
}Sadece etiket kullanmanın hiçbir anlamı yoktur, diğer anahtar kelimelerle birlikte kullanılmalıdır.
goto
goto kontrolü aynı fonksiyon içindeki karşılık gelen etikete aktarır, örnek:
func main() {
a := 1
if a == 1 {
goto A
} else {
fmt.Println("b")
}
A:
fmt.Println("a")
}Pratik uygulamalarda goto çok az kullanılır, zıplamalar kod okunabilirliğini düşürür ve performans tüketimi de bir sorundur.
