Menu
CoddyTech

Tip Seçimi

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 18 / 68.

Tür türündeki bir değeri doğrulamak için tür doğrulamaları iyi çalışsa da, bir arayüz değişkeni için çoğu zaman birden fazla olası türü ele almanız gerekir. İşte bu noktada tür anahtarlaması son derece kullanışlı hâle gelir; somut türe göre farklı işlemler gerçekleştirmenin temiz bir yolunu sunar.

Bir tür switch'i şu özel söz dizimini kullanır: switch v := i.(type). Belirli bir tür yerine (type) anahtar sözcüğünün kullanıldığına dikkat et. v değişkeni, her durumda somut türüyle birlikte gerçek değeri içerir:

func describe(data interface{}) {
    switch v := data.(type) {
    case int:
        fmt.Printf("Integer: %d\n", v)
    case string:
        fmt.Printf("String: %s\n", v)
    case bool:
        fmt.Printf("Boolean: %t\n", v)
    default:
        fmt.Printf("Unknown type: %T\n", v)
    }
}

Her durumda v otomatik olarak doğru türe sahip olur; ek bir tür dönüştürmesi gerekmez. Bu, özellikle tek bir yerde birkaç farklı türü işlemeniz gerektiğinde, tür geçişlerini birden fazla tür dönüştürmesini if-else ifadeleriyle zincirlemekten çok daha temiz hâle getirir.

challenge icon

Görev

Kolay

Bu meydan okumada, bir bildirim sisteminde birden fazla veri türünü işlemek için tür anahtarlarını kullanma pratiği yapacaksın. Farklı türlerdeki bildirimleri işleyen ve somut türlerine göre uygun biçimde biçimlendiren bir işlev oluşturacaksın.

İki girdi alacaksın:

  • Bildirim türünü belirten bir dize (ör. "email", "sms", "push" veya "alert")
  • Bildirim içeriğini veya değerini belirten bir dize

Görevin:

  1. Bir interface{} parametresi alan processNotification adlı bir işlev oluşturmak
  2. Bildirim türü girdisine göre içeriği uygun Go türüne dönüştürmek ve bir interface{} değişkeninde saklamak:
    • "email" için: içeriği dize olarak kullan
    • "sms" için: içeriği bir tam sayıya dönüştür (karakter sayısını belirtir)
    • "push" için: içeriği bir boole değere dönüştür ("enabled" için true, diğer tüm değerler için false)
    • "alert" için: içeriği bir float64 değerine dönüştür (öncelik düzeyini belirtir)
  3. Dönüştürülen değeri kullanarak processNotification işlevini çağırmak
  4. processNotification içinde, her türü işlemek ve uygun mesajı yazdırmak için bir tür anahtarı kullanmak:
    • string için: "Email notification: [value]"
    • int için: "SMS notification with [value] characters"
    • bool için: "Push notifications: [value]"
    • float64 için: "Alert with priority: [value]"
    • Diğer tüm türler için: "Unknown notification type"

Dize dönüştürmeleri için strconv paketini kullan. Boole dönüştürmesinde yalnızca "enabled" değeri true sonucunu vermelidir. Bu meydan okuma, tür anahtarlarının birden fazla türü tek bir kontrol yapısında işlemenin düzenli bir yolunu nasıl sunduğunu ve her durumda doğru türdeki değeri otomatik olarak nasıl sağladığını gösterir.

float64 değerini, fmt.Println veya %v / %g belirteçlerinin yaptığı gibi en kısa biçiminde yazdır: 3.5, 3.5 olarak; 1.0 ise 1 olarak yazdırılır (%f belirteci 1.000000 yazdırır).

Kendin dene

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// Girdiyi oku
	var notificationType string
	var content string
	fmt.Scanln(&notificationType)
	fmt.Scanln(&content)
	
	// TODO: Kodunu aşağıya yaz
	// 1. interface{} parametresi alan processNotification fonksiyonunu oluştur
	// 2. content değerini notificationType değerine göre uygun türe dönüştür
	// 3. processNotification fonksiyonunu dönüştürülmüş değerle çağır
	// 4. Farklı türleri işlemek için processNotification içinde type switch kullan
	
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online Go derleyicisi