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.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayBu 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:
interface{}parametresi alanprocessNotificationadında bir fonksiyon oluşturun- 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)
- Dönüştürülen değerle
processNotificationfonksiyonunu çağırın processNotificationiçinde, her türü işlemek ve uygun mesajı yazdırmak için bir tür anahtarı (type switch) kullanın:stringiçin:"Email notification: [value]"intiçin:"SMS notification with [value] characters"booliçin:"Push notifications: [value]"float64iç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(¬ificationType)
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
}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
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar