Menu
Coddy logo textTech

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 onaylamaları (type assertions) tek bir türü kontrol etmek için iyi çalışsa da, bir arayüz (interface) değişkeni için genellikle birden fazla olası türü işlemeniz gerekir. İşte burada bir tür anahtarı (type switch) inanılmaz derecede yararlı hale gelir; somut türe bağlı olarak farklı eylemler gerçekleştirmek için temiz bir yol sağlar.

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

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 tipe sahip olur - ek bir tip onaylamasına (type assertion) gerek yoktur. Bu, tip anahtarlarını (type switches), if-else ifadeleriyle birden fazla tip onaylamasını zincirlemekten çok daha temiz hale getirir; özellikle tek bir yerde birkaç farklı tipi işlemeniz gerektiğinde.

quiz iconKendini test et

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

quiz iconKendini test et

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

quiz iconKendini test et

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

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ı (type switches) kullanma pratiği yapacaksınız. Farklı bildirim türlerini işleyen ve bunları somut türlerine göre uygun şekilde biçimlendiren bir fonksiyon oluşturacaksınız.

İki girdi alacaksınız:

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

Göreviniz şunları yapmaktır:

  1. interface{} parametresi alan processNotification adında bir fonksiyon oluşturun
  2. Bildirim türü girdisine bağlı olarak, içeriği uygun Go türüne dönüştürün ve bir interface{} değişkeninde saklayın:
    • "email" için: içeriği bir dize (string) olarak kullanın
    • "sms" için: içeriği bir tam sayıya (integer) dönüştürün (karakter sayısını temsil eder)
    • "push" için: içeriği bir boolean'a dönüştürün ("enabled" için true, diğer her şey için false)
    • "alert" için: içeriği bir float64'e dönüştürün (öncelik seviyesini temsil eder)
  3. Dönüştürülen değerle processNotification fonksiyonunu çağırın
  4. processNotification içinde, her türü işlemek ve uygun mesajı yazdırmak için bir tür anahtarı (type switch) kullanın:
    • 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üşümleri için strconv paketini kullanın. Boolean dönüşümü için yalnızca "enabled" değeri true ile sonuçlanmalıdır. Bu meydan okuma, tür anahtarlarının tek bir kontrol yapısında birden fazla türü yönetmek için nasıl temiz bir yol sağladığını ve her durumda size otomatik olarak doğru türdeki değeri nasıl sunduğunu göstermektedir.

Kopya kağıdı

Bir tip anahtarı (type switch), switch v := i.(type) sözdizimini kullanarak bir arayüz değişkeni için birden fazla olası tipi yönetmenin temiz bir yolunu sağlar:

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 bir durumda, v değişkeni otomatik olarak doğru somut tipe sahip olur ve ek tip onaylamalarına (type assertions) duyulan ihtiyacı ortadan kaldı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: Kodunuzu aşağıya yazın
	// 1. interface{} parametresi alan processNotification fonksiyonunu oluşturun
	// 2. notificationType'a göre içeriği uygun türe dönüştürün
	// 3. Dönüştürülen değer ile processNotification fonksiyonunu çağırın
	// 4. Farklı türleri işlemek için processNotification içinde type switch kullanın
	
}
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