Sobes.tech
Middle

Go'da çalışma zamanında bir değişkenin türünü nasıl kontrol edersiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da, çalışma zamanında bir değişkenin tipi birkaç farklı şekilde kontrol edilebilir:

  1. Type assertion kullanarak: Bu, arayüz değişkeninde belirli bir tipi kontrol etmek için uygundur.

    package main
    
    import "fmt"
    
    func main() {
        var i interface{} = "merhaba"
    
        s, ok := i.(string) // i'yi string tipine dönüştürmeye çalışma
        if ok {
            fmt.Printf("Değişken i'nin tipi string: %s\n", s)
        } else {
            fmt.Println("Değişken i'nin tipi string değil")
        }
    }
    
  2. Type switch kullanarak: Bu, arayüz değişkeninde birkaç olası tipi kontrol etmek için uygundur.

    package main
    
    import "fmt"
    
    func main() {
        var t interface{}
    
        switch tt := t.(type) { // tt, durumlara göre belirli bir tipe sahip olacak
        case int:
            fmt.Printf("Değişkenin tipi int: %d\n", tt)
        case string:
            fmt.Printf("Değişkenin tipi string: %s\n", tt)
        case bool:
            fmt.Printf("Değişkenin tipi bool: %t\n", tt)
        case nil:
            fmt.Println("Değişkenin değeri nil")
        default:
            fmt.Printf("Bilinmeyen tip: %T\n", tt) // tt, interface{} tipinde olacak
        }
    
        t = 123
        switch tt := t.(type) {
        case int:
            fmt.Printf("Değişkenin tipi int: %d\n", tt)
        case string:
            fmt.Printf("Değişkenin tipi string: %s\n", tt)
        case bool:
            fmt.Printf("Değişkenin tipi bool: %t\n", tt)
        case nil:
            fmt.Println("Değişkenin değeri nil")
        default:
            fmt.Printf("Bilinmeyen tip: %T\n", tt)
        }
    }
    
  3. reflect paketini kullanarak: Bu, değişkenin tipi ve değer bilgilerini çalışma zamanında almayı sağlar. Tipler derleme zamanında bilinmiyorsa veya daha karmaşık kontroller yapmak gerekiyorsa kullanılır.

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        var x float64 = 3.4
        v := reflect.ValueOf(x) // Reflection değeri al
    
        fmt.Println("Tip:", v.Type())                 // "Tip: float64" gösterir
        fmt.Println("Kategori:", v.Kind())             // "Kategori: float64" gösterir
    
        y := "merhaba"
        vv := reflect.ValueOf(y)
        fmt.Println("Tip:", vv.Type())               // "Tip: string" gösterir
        fmt.Println("Kategori:", vv.Kind())           // "Kategori: string" gösterir
    
        z := []int{1, 2, 3}
        vvv := reflect.ValueOf(z)
        fmt.Println("Tip:", vvv.Type())             // "Tip: []int" gösterir
        fmt.Println("Kategori:", vvv.Kind())         // "Kategori: slice" gösterir
    }
    

reflect paketi daha güçlüdür, ancak kullanımı daha karmaşıktır. Basit tip kontrolleri için type assertion ve type switch tercih edilir, çünkü daha güvenlidir ve tipe odaklıdır.