Anahtar Durum İfadeleri (Switch Case)

Switch ifadesi,çoklu seçenekler içinde anahtar açıp kapatma usulüyle çalışan bir kodlama yapısıdır. Basit bir ifade ile demiryolu makası gibi düşünülebilir. Açık olan anahtar kısmından işlemi devam ettirir.

railroad-switch

Switch Türleri

Go dili, iki tür anahtar deyimini destekler:

  1. İfade Switch
  2. Tip Switch

İfade Switch

İfade switch, C, C++, Java dilindeki switch ifadesine benzer. İfadenin değerine bağlı olarak yürütmeyi kodun farklı bölümlerine göndermenin kolay bir yolunu sağlar.

Syntax:

switch optstatement; optexpression{
case expression1: Statement..
case expression2: Statement..
...
default: Statement..
}

SWITCH YAZIM KURALLARI

  • switch ifadesi sonrasında yazılan optexpression ve optstatement opsiyonel ifadelerdir.
  • Eğer hem optexpression hem de optstatement ifadede mevcut ise ikisinin arasına noktalı virgül ; işareti koymak gereklidir.
  • Eğer switch herhangi bir ifade içermiyorsa, derleyici ifadenin true olduğunu varsayar.
  • optstatement değişken tanımlamaları, artış ya da atama durumları, fonksiyon çağrıları vb. gibi basit durumları içerir.
  • Eğer değişken optstatement içerisinde görüntülenirse, değişkenin aralığı switch ifadesi ile sınırlıdır.
  • switch ve case ifadeleri dahili olarak break ile durdurulmaz. Fakat şart sağlandığında otomatik olarak anahtar değeri değişir ve bir sonraki aşamaya geçilir.
  • default ifadesi switch ifadesinde isteğe bağlı olarak kullanılır.
  • case ifadesi birden fazla değişken içerirse bu ifadeler virgül (,) ile ayrılırlar.
  • Eğer case ifadesi herhangi bir ifade içermiyorsa, sistem bu ifadenin değerinin true kabul eder.

İlk örnek ifademizi yazalım :

package main

import "fmt"

func main(){

		// optstatement  - day ifadesi day:=4 olarak tanımlandı
	// optexpression -  olculecek deger day ifadesi olarak belirlendi
    switch day:=4; day {
    case 1:
        fmt.Println("Pazartesi")
    case 2:
        fmt.Println("Salı")
    case 3:
        fmt.Println("Çarşamba")
    case 4:
        fmt.Println("Perşembe")
    case 5:
        fmt.Println("Cuma")
    case 6:
        fmt.Println("Cumartesi")
    case 7:
        fmt.Println("Pazar")
    default:
        fmt.Println("Geçerli Bir gün Girmediniz!")
        return
    }
}

Kodumuzu çalıştırdığımızda aşağıdaki çıktıyı elde edeceğiz:

Perşembe

Yukarıdaki ifadede day isimli değişkene 4 değeri atanmıştır. switch - case ifadeleri ile kontrol edilmek üzere day ifadelerinin inceleneceği belirtilip {} ile case yani durumlar belirtilmiştir. case 4: durumu yani kontrol edilen değer olan day değişkeninin 4'e eşit olduğu durumda haftanın dördüncü günü olan Perşembe değeri ekranda görüntülenmiştir.

Şimdi ikinci bir ifade ile devam edelim :

package main

import (
	"fmt"
)

func main(){

	var secim int = 3

	switch secim {
	case 1:
		fmt.Println("Cemil")
	case 2:
		fmt.Println("Ramazan")
	case 3:
		fmt.Println("Şaban")
	case 4:
		fmt.Println("Haydar")
	default:
		fmt.Println("Nuri")
		return
	}
}

Bu ifademizde secim isimli değişken işlem öncesinde int olarak 3 değeri ile tanımlanmıştır. switch ifademizde secim isimli değişkenin durumlarının değerlendirileceğini belirttikten sonra case ile kontrol ettiğimizde 3 değerinin olduğu koldaki fmt.Println("Şaban) isimli ismi ekranda görüntüleyecektir.

Şaban

Şimdi başka bir ifade ile devam edelim:

package main

import "fmt"

func main() {
	var firstName string = "Gökay"

	fmt.Printf("Sorgulanan İsim: %s \n", firstName)

	switch firstName {
	case "Ahmad", "Mohammad":
		fmt.Println("Arap İsmi")
	case "Gökay", "Alp", "Tolga":
		fmt.Println("Türk İsmi")
	case "Solomon", "David", "Benjamin":
		fmt.Println("Yahudi İsmi")
	case "George", "John":
		fmt.Println("Amerikan İsmi")
	case "Hans", "Jurgen":
		fmt.Println("Alman İsmi")
	case "Pierre", "Michel":
		fmt.Println("Fransız İsmi")
	}
}

Yukarıdaki ifadede firstName isimli değişkenimizi Gökay olarak tanımladık. case sorgularımız sırasında ifadeler kümesi olarak değerlendirmeye başladık. İlk case durumumuzda Ahmet veya Mehmet isimlerinden biriyse fmt.Println("Arap İsmi") olarak sonuç döndür dedik. her case ifadesi için birden çok seçenek sorguladık. İkinci case ifademizde verdiğimiz Gökay değeri yakalandığı için bu kolda yer alan fmt.Println("Türk ismi") seçeneği ekranda görüntülendi.

Sorgulanan isim :  Gökay
Türk ismi

Tip Switch (Type Switch)

Tip switch anahtarı, türleri karşılaştırmak istediğinizde kullanılır. Bu anahtarda, case ifadesi , switch ifadesinde bulunan tür ile karşılaştırılacak olan türü içerir.

Syntax:

switch optstatement; typeswitchexpression{
case typelist 1: Statement..
case typelist 2: Statement..
...
default: Statement..
}

TYPE SWITCH KURALLARI:

  • Opsiyonel ifade, yani optstatement, switch ifadesindeki ile benzerdir.
  • Bir optstatement birden fazla değer içeriyorsa ve bu değerler virgül(,) ile ayrılırlar.
  • switch deyimi türünde, case ve default deyimi herhangi bir break deyimi içermez. Ancak, programınız gerekliyse, break ve fallthrough ifadesini kullanmanıza izin verilir.
  • typeswitchexpression' de default isteğe bağlıdır.
  • typeswitchexpression, sonucu bir tür olan bir ifadedir.
  • typeswitchexpression içinde := operatörü kullanılarak bir ifade atanırsa, bu değişkenin türü, case yan tümcesinde bulunan türe bağlıdır. case yan tümcesi iki veya daha fazla tür içeriyorsa, değişkenin türü, typeswitchexpression içinde oluşturulduğu türdür.

Example:


package main

import "fmt"

func main() {

	// interface yapısında myvalue isimli bir değişken tanımladık
	var myvalue interface{}

	// myvalue ifadesine ait type görüntüleniyor
	switch q:= myvalue.(type) {
	case bool:
		fmt.Println("boolean type")
	case string:
		fmt.Println("string type")
	case float64:
		fmt.Println("float64 type")
	case int:
		fmt.Println("int type")
	default:
		fmt.Printf("type: %T", q)
	}
}

Yukarıdaki ifadede ilk olarak myvalue isimli interface türünde bir değişken tanımladık.

q:= myvalue.(type)

Yukarıdaki ifade ile myvalue isimli değişkenin type değerini döndürdük. Burada değerimiz int, float64, string gibi primitive data type ifadelerden biri olmadığından dolayı test edilen durumların hepsini geçerek default isimli ifadeye geldik. Bu ifade mevcut ifadelerden hiçbiriyle eşleşen bir durum yoksa döndürülecek case ifadesini barındırır. Burada da %T ile veri tipini görüntüledik. Sistem bize interface ifademiz için bir değer almadığından dolayı nil ifadesini döndürdü ve çıktımız aşağıdaki şekilde oldu.

type: <nil>[Finished in 634ms]