Menu
Coddy logo textTech

Boş Arayüz

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

Şimdiye kadar belirli metotlar gerektiren arayüzlerle çalıştınız, ancak Go'nun inanılmaz derecede esnek olan özel bir arayüzü vardır: interface{} olarak yazılan boş arayüz.

Boş arayüzün hiçbir metot gereksinimi yoktur, bu da Go'daki herhangi bir türün onu otomatik olarak sağladığı anlamına gelir. Her tür (en azından) sıfır metot uyguladığı için, her tür bir interface{} değişkenine atanabilir:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // slice

Bu durum, bilinmeyen veya değişken türlerdeki verilerle çalışmanız gerektiğinde interface{} yapısını son derece kullanışlı hale getirir. Yapılandırma dosyalarını okurken, kullanıcı girişlerini işlerken veya duruma göre farklı veri türleri döndüren API'lerle çalışırken bununla karşılaşabilirsiniz.

Ancak, boş arayüz her türü tutabildiği için, değeri anlamlı bir şekilde kullanabilmenizden önce içinde gerçekte hangi türün saklandığını sık sık belirlemeniz gerekecektir. İşte bu nokta, interface{} değerleriyle güvenli bir şekilde çalışmak için tür onaylamalarının (type assertions) ve tür anahtarlarının (type switches - bir sonraki bölümde öğreneceksiniz) temel araçlar haline geldiği yerdir.

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, farklı türdeki değerleri işleyebilen bir veri işlemcisi oluşturarak boş arayüz (empty interface) ile çalışma pratiği yapacaksınız. Bir interface{} parametresi kabul eden ve çeşitli veri türlerini işleyen bir fonksiyon oluşturacaksınız.

İki girdi alacaksınız:

  • Veri türünü temsil eden bir dize (örneğin, "int", "string", "bool" veya "slice")
  • Gerçek değeri temsil eden bir dize (örneğin, "42", "hello", "true" veya "1,2,3")

Göreviniz şunları yapmaktır:

  1. Bir interface{} parametresi alan ve değer hakkında bilgi yazdıran processData adında bir fonksiyon oluşturun
  2. Veri türü girdisine bağlı olarak, değer dizesini uygun Go türüne dönüştürün:
    • "int" için: tam sayıya dönüştürün
    • "string" için: dize olarak kullanın
    • "bool" için: boolean'a dönüştürün
    • "slice" için: virgülle ayrılmış değerleri bir tam sayı dilimine (slice of integers) dönüştürün
  3. Dönüştürülen değerle processData fonksiyonunu çağırın
  4. processData içinde, değeri ve türünü şu formatta yazdırın: "Value: [value], Type: [type]"

Dilim (slice) girdisi için, "1,2,3" gibi virgülle ayrılmış dize []int{1, 2, 3} yapısına dönüştürülmelidir. Fonksiyon interface{} kabul ettiği için her türle çalışmalıdır; bu da boş arayüzün herhangi bir türdeki değerleri nasıl tutabildiğini gösterir. Değeri ve türü sırasıyla görüntülemek için %v ve %T format belirteçleriyle fmt.Printf kullanın.

Kopya kağıdı

Boş arayüz interface{} herhangi bir metot gereksinimine sahip değildir, bu da Go'daki herhangi bir türün onu otomatik olarak karşıladığı anlamına gelir:

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // slice

Boş arayüz; yapılandırma dosyaları, kullanıcı girişi veya farklı veri türleri döndüren API'ler gibi bilinmeyen veya değişken türdeki verilerle çalışmak için kullanışlıdır.

Bir interface{} değişkeninin değerini ve türünü görüntülemek için %v ve %T format belirteçleriyle birlikte fmt.Printf kullanın:

fmt.Printf("Value: %v, Type: %T", value, value)

Standart kütüphaneden kullanışlı dönüştürme yardımcıları:

import (
    "strconv"
    "strings"
)

// Convert string to int (Diziyi tam sayıya dönüştür)
n, err := strconv.Atoi("42")       // n = 42

// Convert string to bool (Diziyi mantıksal değere dönüştür)
b, err := strconv.ParseBool("true") // b = true

// Split a string into a slice (Bir diziyi dilimlere ayır)
parts := strings.Split("a,b,c", ",") // ["a", "b", "c"]

Kendin dene

package main

import (
	"fmt"
)

func main() {
	// Girdiyi oku
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// TODO: Kodunuzu aşağıya yazın
	// 1. interface{} kabul eden processData fonksiyonunu oluşturun
	// 2. valueStr'yi dataType'a göre uygun türe dönüştürün
	// 3. Dönüştürülen değerle processData'yı çağırı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