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} // sliceBu 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.
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, 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:
- Bir
interface{}parametresi alan ve değer hakkında bilgi yazdıranprocessDataadında bir fonksiyon oluşturun - 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
- Dönüştürülen değerle
processDatafonksiyonunu çağırın processDataiç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} // sliceBoş 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
}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