Bir switch, bir değeri case listesiyle karşılaştırır ve ilk eşleşeni çalıştırır. C, Java ve JavaScript'ten farklı olarak Go'da bir case bir sonrakine geçmez, bu yüzden unutulacak bir break yoktur.
Case'ler yukarıdan aşağı kontrol edilir ve yalnızca ilk eşleşen case çalışır. Hiçbir şey eşleşmediğinde default çalışır; isteğe bağlıdır ve listenin herhangi bir yerinde olabilir, ama geleneksel olarak en sona konur.
Case Başına Birden Fazla Değer
case "sat", "sun": iki değerden birine eşleşir. Go, C'nin üst üste dizilmiş boş case'lerle yaptığını böyle ifade eder. Karşılaştırılabilir her tip çalışır: string'ler, sayılar, rune'lar, boolean'lar, pointer'lar ve enum'lar gibi adlandırılmış tipler:
Aynı sabit değere sahip iki case derleme hatasıdır:
./main.go:10:7: duplicate case 1 (constant of type int) in expression switch
./main.go:8:7: previous case
Koşulsuz switch
İfadeyi yazmazsanız her case bir boolean teste dönüşür. Bu, uzun bir if/else if zincirinin Go'daki daha temiz biçimidir:
switch {, switch true { ifadesinin kısaltmasıdır. İlk doğru case kazandığı için sıra önemlidir: bmi < 25'e yalnızca bmi < 18.5 false olduğunda ulaşılır, bu yüzden her case yukarıdakilerin başarısız olduğunu varsayabilir.
Init İfadeli switch
if gibi bir switch de kısa bir ifadeyle başlayabilir. Orada tanımlanan değişkenlerin kapsamı switch ile sınırlıdır:
Init ifadesi koşulsuz bir switch ile de birleştirilebilir: switch n := len(items); { case n == 0: ... }.
fallthrough
Gerçekten bir sonraki case'e devam etmek istediğinizde, bir case'in son ifadesi olarak fallthrough yazın. Kontrolü bir sonraki case'in gövdesine koşulunu değerlendirmeden aktarır:
Seviye 2 önce write, sonra read yazdırır ve izinleri aşağı doğru biriktirir. Sonraki case'lerin koşulları kontrol edilmez: case 2'den gelen fallthrough sonrasında, level 2 olmasına rağmen case 1 çalışır.
fallthrough kuralları:
- Case'teki son ifade olmalıdır.
- Son case'te bulunamaz:
cannot fallthrough final case in switch. - Bir type switch içinde izin verilmez.
Pratikte Go kodunda fallthrough nadirdir. Case başına birden fazla değer yaygın ihtiyacı karşılar ve açık fonksiyon çağrıları genellikle bir fallthrough zincirinden daha anlaşılırdır.
switch İçinde break
Bir case içindeki break, switch'ten çıkar. Case'ler kendiliğinden bittiği için ona yalnızca bir case'ten erken çıkmak için ihtiyaç duyarsınız. Tuzak, bir döngü içindeki switch'tir:
loop etiketi olmadan break switch'i bitirir ve döngü "c"'ye devam eder. Öte yandan continue her zaman çevreleyen döngüyü ifade eder, çünkü bir switch döngü değildir.
Tiplere Göre switch
Bir type switch, özel v.(type) biçimini kullanarak bir interface değerinin dinamik tipine göre dallanır:
Tek tipli bir case'te x o tipe sahiptir (string case'inde len(x) çalışır). Birkaç tip listeleyen bir case'te x interface tipini korur. Type assertion sayfası type switch'leri ve v.(T) assertion'ını ayrıntılı anlatıyor.
Go'nun switch'inin Farklı Yaptıkları
| Davranış | C, Java, JavaScript | Go |
|---|---|---|
| Bir sonraki case'e düşmek | varsayılan | yalnızca fallthrough ile |
Her case'in sonunda break | zorunlu | gerekmez |
| Case başına birkaç değer | üst üste boş case'ler | case a, b, c: |
| Case değerleri | (çoğunlukla) sabitler | yukarıdan aşağı değerlendirilen herhangi bir ifade |
| switch değeri | tam sayı tipleri (C) | karşılaştırılabilir her tip |
| switch ifadesi olmadan | izin verilmez | switch { case cond: } |
Case ifadelerinin sabit olması gerekmez. case limit(), max + 1: geçerlidir; biri eşleşene kadar sırayla değerlendirilirler, bu yüzden sonraki ifadeler hiç çalışmayabilir.
Kapsayıcılık
Go, bir enum üzerindeki switch'in her değeri kapsayıp kapsamadığını kontrol etmez. Beklemediğiniz değerler için loglayan, hata döndüren ya da panic yapan bir default ekleyin veya eksik case'lerin derleme zamanında raporlanması için exhaustive linter'ını (golangci-lint'in bir parçası) kullanın.
Sıkça Sorulan Sorular
Go'da switch bir sonraki case'e geçer mi?
Hayır. Go'da bir case, bir sonraki case'te otomatik olarak biter; onu durdurmak için asla break yazmazsınız. Çalışmanın bir sonraki case'in gövdesine devam etmesini istiyorsanız case'in son ifadesi olarak fallthrough yazın. Bir sonraki case'in koşulunu kontrol etmeden koşulsuz olarak atlar.
Go'da tek bir case'te birkaç değer nasıl eşleştirilir?
Onları virgülle ayırarak listeleyin: case "sat", "sun":. switch değeri bunlardan herhangi birine eşitse case çalışır. Bu, C ya da Java'da üst üste dizdiğiniz boş fall-through case'lerinin yerini alır.
Go'da koşulsuz switch nedir?
switch { case x < 0: ...; case x == 0: ...; default: ... }. switch'ten sonra ifade olmadığında her case bir boolean koşuldur ve ilk doğru olan çalışır. Uzun bir if/else if zincirinin deyimsel karşılığıdır.
Go'da switch içinde break ne yapar?
Çevreleyen bir for döngüsünü değil, switch'i sonlandırır. Case'ler kendiliğinden bittiği için buna nadiren ihtiyaç duyulur, ama bir döngü içindeki switch'te döngüden çıkmayı bekleyerek break yazanları şaşırtır. Bunun için etiketli bir break ya da return kullanın.