fmt.Stringer Arayüzü
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 75 / 107.
fmt.Stringer arayüzü, türlerinizin yazdırıldığında nasıl görüneceğini kontrol eder. Go'da en yaygın uygulanan arayüzlerden biridir ve fmt paketinde tanımlanmıştır:
type Stringer interface {
String() string
}Bir değeri fmt.Println, %v ile fmt.Printf veya benzeri fonksiyonlara geçirdiğinizde, Go türün Stringer arayüzünü uygulayıp uygulamadığını kontrol eder. Eğer uyguluyorsa, Go metin temsilini elde etmek için String() metodunu çağırır.
type Temperature struct {
Celsius float64
}
func (t Temperature) String() string {
return fmt.Sprintf("%.1f°C", t.Celsius)
}
func main() {
temp := Temperature{Celsius: 23.5}
fmt.Println(temp) // 23.5°C
}String() metodu olmadan, yazdırma işlemi varsayılan struct formatını gösterirdi: {23.5}. Stringer arayüzünü uygulayarak, türünüzün kendisini tam olarak nasıl sunacağını kontrol edersiniz.
Bu, ham alan değerlerinin anlamı net bir şekilde iletmediği türler için özellikle yararlıdır. Bir Duration türü, ham nanosaniyeleri göstermek yerine "2h 30m" olarak görüntülenebilir veya bir User türü, tüm alanları yerine biçimlendirilmiş bir ad gösterebilir.
Görev
KolaySüreleri insan dostu bir formatta görüntüleyen bir zaman takip sistemi oluşturalım! Özel türlerinizin yazdırıldığında nasıl görüneceğini kontrol etmek için fmt.Stringer arayüzünü uygulayacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
duration.go: Özel dize gösterimlerine sahip zamanla ilgili türlerinizi tanımlayın.Toplam dakika sayısını tam sayı olarak saklayan bir
Durationyapısı (struct) oluşturun. Yazdırıldığında, 150 dakika için2h 30mveya 45 dakika için0h 45mgibi okunabilir bir formatta görüntülenecek şekildeString()metodunu uygulayın. Saat ve dakikalar her zaman gösterilmelidir.Name(string) veTime(Duration) alanlarına sahip birTaskyapısı oluşturun. Task üzerindeString()metodunu, sürenin kendi String metodunu kullandığı[Name]: [duration]formatında görüntülenecek şekilde uygulayın.main.go: Görevleri süreleriyle birlikte oluşturun ve görüntüleyin.Görev sayısını okuyun, ardından her görev için adını ve dakika cinsinden süresini okuyun. Task örnekleri oluşturun ve her birini doğrudan
fmt.Printlnkullanarak yazdırın; Stringer arayüzü biçimlendirmeyi otomatik olarak halledecektir.Tüm görevleri yazdırdıktan sonra, tüm görevlerin toplam süresini şu formatta hesaplayın ve yazdırın:
Total: [duration]
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Görev sayısı
- Sonraki satırlar: Görev adı ve dakikası (her görev için iki satır)
Örneğin, şu girdi verildiğinde:
3
Code Review
90
Meeting
45
Documentation
120Çıktınız şu olmalıdır:
Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15mVe şu girdi verildiğinde:
2
Design
180
Testing
65Çıktınız şu olmalıdır:
Design: 3h 0m
Testing: 1h 5m
Total: 4h 5mStringer arayüzünü uygulayarak, türleriniz Go'nun yazdırma işlevleriyle sorunsuz bir şekilde entegre olur. {90} gibi ham yapı alanlarını görmek yerine, kullanıcılar için anlamlı olan çıktılar elde edersiniz.
Kopya kağıdı
fmt.Stringer arayüzü, türlerin yazdırıldığında nasıl görüneceğini kontrol eder:
type Stringer interface {
String() string
}Bir değeri fmt.Println'e veya %v ile fmt.Printf'e ilettiğinizde, Go bu türün Stringer arayüzünü uygulayıp uygulamadığını kontrol eder. Eğer uyguluyorsa, Go metin temsilini almak için String() metodunu çağırır.
Örnek uygulama:
type Temperature struct {
Celsius float64
}
func (t Temperature) String() string {
return fmt.Sprintf("%.1f°C", t.Celsius)
}
func main() {
temp := Temperature{Celsius: 23.5}
fmt.Println(temp) // 23.5°C
}String() metodu olmadan, yazdırma işlemi varsayılan struct formatını gösterir: {23.5}. Stringer arayüzünü uygulayarak, türünüzün kendisini tam olarak nasıl sunacağını kontrol eder, çıktıyı daha anlamlı ve kullanıcı dostu hale getirirsiniz.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Görev sayısını oku
line, _ := reader.ReadString('\n')
numTasks, _ := strconv.Atoi(strings.TrimSpace(line))
// TODO: Görevleri saklamak için bir slice oluştur
// TODO: Toplam dakikayı takip et
for i := 0; i < numTasks; i++ {
// Görev adını oku
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Dakika cinsinden görev süresini oku
minutesLine, _ := reader.ReadString('\n')
minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))
// TODO: Ad ve Duration ile bir Task oluştur
// TODO: Görevi yazdır (fmt.Println, Stringer arayüzünü kullanacaktır)
// TODO: Dakikaları toplama ekle
_ = name
_ = minutes
}
// TODO: Toplam süreyi "Total: Xh Ym" formatında yazdır
}
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ı11Standart Kütüphane ve OOP
io.Reader ve io.Writersort.Interface Arayüzüfmt.Stringer ArayüzüStruct'lar ile encoding/jsonhttp.Handler ArayüzüÖzet - REST API Modelleri3İş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