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ğundan, her tür boş arayüzü otomatik olarak karşılar. Bu, herhangi bir türdeki değerleri tutabilmesini sağlar.
var anything interface{}
anything = 42
anything = "hello"
anything = true
anything = []int{1, 2, 3}Go 1.18 ile birlikte, any anahtar sözcüğü interface{} için bir takma ad olarak tanıtıldı. Bunlar tamamen birbirinin yerine kullanılabilir, ancak any okunması daha kolaydır.
var value any = "Go is awesome"Boş arayüz, türü bilinmeyen veya değişkenlik gösteren değerleri işlemeniz gerektiğinde kullanışlıdır. fmt.Println gibi işlevler, her türden bağımsız değişkeni 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 bunun bir dezavantajı vardır. Bir değer boş bir arayüzde depolandığında, değerle ilgili belirli tür bilgilerine erişiminizi kaybedersiniz.
Alttaki türü önce çıkarmadan yöntemleri doğrudan çağıramaz veya alanlara erişemezsiniz. Sonraki derslerde, tür iddialarını ve tür anahtarlarını kullanarak boş bir arabirimden somut türün nasıl alınacağını ele alacağız.
Görev
KolayBoş arayüzü kullanarak her türden değeri tutabilen esnek bir depolama kapsayıcısı oluşturalım. Farklı türleri aynı yapı içinde depolamanıza any türünün nasıl olanak sağladığını gösteren basit bir kutu oluşturacaksınız.
Kodunuzu iki dosya arasında düzenleyeceksiniz:
box.go: Tek birBoxalanı bulunan ve bu alanın türüContentolan biranyyapısı tanımlayın. Her türden bir değeri kabul eden ve bu değeri içeren bir Box işaretçisi döndürenNewBoxkurucu işlevini oluşturun. Kutuda ne depolandığını gösteren bir dize döndüren birDescribeyöntemi ekleyin.main.go: Girdiden farklı değerleri okuyun, bir tamsayı, bir dize ve bir boolean içeren kutular oluşturun, ardından aynı Box türünün tamamen farklı değerleri nasıl tutabildiğini göstermek için her kutunun açıklamasını yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Bir tamsayı değeri
- 2. satır: Bir dize değeri
- 3. satır: Bir boolean değeri (
trueveyafalse)
Describe yönteminiz şu biçimde bir dize döndürmelidir:
Box contains: [value]Örneğin 42, hello ve true verildiğinde çıktınız şu şekilde olmalıdır:
Box contains: 42
Box contains: hello
Box contains: trueBuradaki temel fikir, tek bir Box yapınızın bir tamsayı, bir dize veya bir boolean depolayabilmesidir: bunun nedeni any türünün her türden değeri kabul etmesidir. Her kutu farklı bir şey tutar, ancak hepsi aynı Box türündedir.
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 değerini oku
line2, _ := reader.ReadString('\n')
strVal := strings.TrimSpace(line2)
// Boolean değerini oku
line3, _ := reader.ReadString('\n')
boolVal, _ := strconv.ParseBool(strings.TrimSpace(line3))
// TODO: NewBox kullanarak her değer için kutular oluştur
// TODO: Describe metodunu kullanarak her kutunun açıklamasını yazdır
// Derleme hatalarını önlemek için değişkenleri kullan (uygularken bu satırları kaldır)
_ = 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 PoolKendi başına pratik yap: Online Go derleyicisi