Boş Arayüz (any)
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 28 / 107.
Boş arayüz, sıfır metoda sahip bir arayüzdür. Go'daki her tür en az sıfır metoda sahip olduğu için, her tür otomatik olarak boş arayüzü sağlar. Bu, onun her türden değeri tutabilmesini sağlar.
var anything interface{}
anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}Go 1.18 ile başlayarak, any anahtar kelimesi interface{} için bir takma ad olarak tanıtıldı. Tamamen birbirlerinin yerine kullanılabilirler, ancak any okuması daha temizdir.
var value any = "Go is awesome"Boş arayüz (empty interface), bilinmeyen veya değişken türlerdeki değerleri işlemeniz gerektiğinde kullanışlıdır. fmt.Println gibi fonksiyonlar, herhangi bir türdeki argümanları kabul etmek için bunu kullanır:
func PrintAnything(v any) {
fmt.Println("Value:", v)
}
func main() {
PrintAnything(100)
PrintAnything("text")
PrintAnything(3.14)
}Ancak, bir ödünleşim söz konusudur. Bir değer boş bir arayüzde (empty interface) saklandığında, o değerin özel tür bilgilerine erişiminizi kaybedersiniz.
Altta yatan türü önce çıkarmadan, doğrudan metotları çağıramaz veya alanlara erişemezsiniz. Gelecek dersler, tür onaylamaları (type assertions) ve tür anahtarları (type switches) kullanarak boş bir arayüzden somut türün nasıl elde edileceğini kapsayacaktır.
Görev
KolayBoş arayüzü (empty interface) kullanarak her türden değeri tutabilen esnek bir depolama konteyneri oluşturalım. any tipinin aynı yapı içinde farklı türleri saklamanıza nasıl olanak tanıdığını gösteren basit bir kutu oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
box.go:anytipinde tek birContentalanına sahip birBoxyapısı (struct) tanımlayın. Herhangi bir türde bir değer kabul eden ve bu değeri içeren bir Box'a işaretçi (pointer) döndüren birNewBoxyapıcı (constructor) fonksiyonu oluşturun. Kutuda neyin saklandığını gösteren bir dize (string) döndüren birDescribemetodu ekleyin.main.go: Girdiden farklı değerler okuyun; bir tam sayı (integer), bir dize (string) ve bir mantıksal değer (boolean) içeren kutular oluşturun, ardından aynı Box tipinin nasıl tamamen farklı değerler tutabildiğini göstermek için her kutunun açıklamasını yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Bir tam sayı (integer) değeri
- Satır 2: Bir dize (string) değeri
- Satır 3: Bir mantıksal (boolean) değer (
trueveyafalse)
Describe metodunuz şu formatta bir dize döndürmelidir:
Box contains: [value]Örneğin, 42, hello ve true verildiğinde, çıktınız şöyle olmalıdır:
Box contains: 42
Box contains: hello
Box contains: trueBuradaki temel nokta, tek bir Box yapınızın bir tam sayı, bir dize veya bir mantıksal değer saklayabilmesidir; bunun nedeni any tipinin her türden değeri kabul etmesidir. Her kutu farklı bir şey tutar, ancak hepsi aynı Box tipindedir.
Kopya kağıdı
Boş arayüz (interface{}), sıfır metoda sahip bir arayüzdür. Go'daki her tür en az sıfır metoda sahip olduğundan, her tür otomatik olarak boş arayüzü karşılar ve bu da onu her türden değeri tutabilir hale getirir.
var anything interface{}
anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}Go 1.18'den başlayarak, any anahtar kelimesi interface{} için bir takma ad olarak tanıtıldı. Bunlar tamamen birbirinin yerine kullanılabilir, ancak any okunması daha temizdir:
var value any = "Go is awesome"Boş arayüz, bilinmeyen veya değişen türlerdeki değerleri işlemek için kullanışlıdır. Fonksiyonlar her türden argümanı kabul edebilir:
func PrintAnything(v any) {
fmt.Println("Value:", v)
}
func main() {
PrintAnything(100)
PrintAnything("text")
PrintAnything(3.14)
}Ödünleşim (Tradeoff): Bir değer boş bir arayüzde saklandığında, onun özel tür bilgilerine erişimi kaybedersiniz. Tür onaylamaları (type assertions) veya tür anahtarları (type switches) kullanarak temel türü çıkarmadan yöntemleri doğrudan çağıramaz veya alanlara erişemezsiniz.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Tam sayı değerini oku
line1, _ := reader.ReadString('\n')
intVal, _ := strconv.Atoi(strings.TrimSpace(line1))
// Dize (string) değerini oku
line2, _ := reader.ReadString('\n')
strVal := strings.TrimSpace(line2)
// Mantıksal (boolean) değeri oku
line3, _ := reader.ReadString('\n')
boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))
// TODO: NewBox kullanarak her değer için kutular oluşturun
// TODO: Describe metodunu kullanarak her kutunun açıklamasını yazdırın
// Derleme hatalarını önlemek için değişkenleri kullanın (uygulama sırasında bu satırları kaldırın)
_ = intVal
_ = strVal
_ = boolVal
// Örnek çıktı formatı:
// fmt.Println(box.Describe())
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker Pool