Anonim Struct'lar
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 15 / 107.
Anonim bir struct, isimlendirilmiş bir türü olmayan bir struct'tır. Yapısını tanımlar ve type anahtar kelimesini kullanmadan tek bir adımda bir örneğini oluşturursunuz.
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Bu, yeniden kullanılabilir bir tür bildirmeden doğrudan bir struct değeri oluşturur. Anonim struct'lar, kodunuzun başka bir yerinde kullanılmayacak hızlı, tek seferlik bir veri yapısına ihtiyaç duyduğunuzda kullanışlıdır.
Yaygın bir kullanım durumu, tek bir fonksiyon veya test için ilgili verileri gruplandırmaktır.
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostAnonim struct'lar, her bir test senaryosunun benzersiz alanlara sahip olduğu tablo güdümlü testlerde de popülerdir.
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Anonim struct'ların bir tip adı olmadığı için, üzerlerinde metot tanımlayamaz veya tipi başka bir yerde yeniden kullanamazsınız. Bunları geçici, yerelleştirilmiş veri gruplama için kullanın. Birden çok kez referans vereceğiniz her şey için bunun yerine isimlendirilmiş bir struct tipi tanımlayın.
Görev
KolayYeniden kullanılabilir bir türe ihtiyaç duymayan, tek seferlik veri gruplandırmaları için anonim struct'ların (anonymous structs) ne kadar kullanışlı olduğunu gösteren hızlı bir yapılandırma sistemi oluşturalım.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
config.go: Parametre olarak bir sunucu adı (string), port (int) ve hata ayıklama modu (bool) alanGetServerConfigadında bir fonksiyon oluşturun. Bu fonksiyon, bu üç değeriName,PortveDebugalanları olarak içeren anonim bir struct döndürmelidir. Bu yapılandırma yalnızca bir yerde kullanıldığı için, onun için isimlendirilmiş bir tür tanımlamaya gerek yoktur.main.go: Sunucu yapılandırma değerlerini girdiden okuyun,GetServerConfigfonksiyonunuzu çağırın ve yapılandırma ayrıntılarını görüntüleyin.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Sunucu adı
- Satır 2: Port numarası
- Satır 3: Hata ayıklama modu (
trueveyafalse)
Çıktı formatı:
Server: [Name]
Port: [Port]
Debug: [Debug]Örneğin, api-server, 8080 ve true verildiğinde, çıktınız şöyle olmalıdır:
Server: api-server
Port: 8080
Debug: trueAnonim struct'ın, yalnızca bir kez kullanılan bir türle kod tabanınızı kalabalıklaştırmadan gruplandırılmış verileri döndürmenize nasıl olanak tanıdığına dikkat edin.
Kopya kağıdı
Anonim struct, type anahtar kelimesini kullanmadan tek bir adımda tanımlanan ve örneği oluşturulan, isimlendirilmiş bir türü olmayan bir struct'tır:
person := struct {
Name string
Age int
}{
Name: "Alice",
Age: 30,
}Anonim struct'lar, kodunuzun başka bir yerinde tekrar kullanılmayacak tek seferlik veri yapıları için kullanışlıdır.
Yaygın kullanım durumları, tek bir fonksiyon için ilgili verileri gruplandırmayı içerir:
config := struct {
Host string
Port int
}{
Host: "localhost",
Port: 8080,
}
fmt.Println(config.Host) // localhostVe tablo tabanlı testler:
tests := []struct {
input int
expected int
}{
{1, 2},
{5, 10},
}Anonim struct'lar üzerlerinde tanımlanmış metodlara sahip olamazlar veya bir tür olarak tekrar kullanılamazlar. Bunları geçici, yerelleştirilmiş veri gruplandırması için kullanın. Birden çok kez başvurulan türler için bunun yerine isimlendirilmiş bir struct tanımlayın.
Fonksiyonlar anonim struct'lar döndürebilir:
func GetConfig() struct {
Name string
Port int
} {
return struct {
Name string
Port int
}{
Name: "server",
Port: 8080,
}
}Kendin dene
package main
import (
"fmt"
)
func main() {
// Giriş değerlerini oku
var name string
var port int
var debug bool
fmt.Scanln(&name)
fmt.Scanln(&port)
fmt.Scanln(&debug)
// TODO: Giriş değerleri ile GetServerConfig fonksiyonunu çağırın
// ve döndürülen anonim yapıyı (struct) saklayın
// TODO: Yapılandırmayı istenen formatta yazdırın:
// Server: [Name]
// Port: [Port]
// Debug: [Debug]
}
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