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.
Görev
KolayBu 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:
- Bir
interface{}parametresi alanprocessNotificationadlı bir işlev oluşturmak - 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)
- Dönüştürülen değeri kullanarak
processNotificationişlevini çağırmak processNotificationiçinde, her türü işlemek ve uygun mesajı yazdırmak için bir tür anahtarı kullanmak: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üş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(¬ificationType)
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
}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ışlarKendi başına pratik yap: Online Go derleyicisi