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 denetler. Go'da en sık uygulanan arayüzlerden biridir ve fmt paketinde tanımlanmıştır:
type Stringer interface {
String() string
}fmt.Println, %v ile fmt.Printf veya benzer işlevlere bir değer geçirdiğinde Go, türün Stringer arayüzünü uygulayıp uygulamadığını kontrol eder. Uyguluyorsa Go, metin gösterimini elde etmek için String() yöntemini ç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() yöntemi olmadan yazdırma, varsayılan yapı biçimini gösterirdi: {23.5}. Stringer uygulayarak türünüzün kendisini tam olarak nasıl sunduğunu kontrol edersiniz.
Bu, ham alan değerlerinin anlamı açıkça ifade etmediği türler için özellikle kullanışlı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 biçimde görüntüleyen bir zaman takip sistemi oluşturalım! Özel türleriniz 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 arasında düzenleyeceksiniz:
duration.go: Özel dize gösterimlerine sahip zamanla ilgili türleri tanımlayın.Toplam dakika sayısını bir tamsayı olarak saklayan bir
Durationyapısı oluşturun. Yazdırıldığında, 150 dakika içinString()veya 45 dakika için2h 30mgibi okunabilir bir biçimde görüntülenmesi için0h 45mmetodunu uygulayın. Saatler ve dakikalar her zaman gösterilmelidir.Task(string) veName(Duration) alanlarına sahip birTimeyapısı oluşturun. Sürenin kendi String metodunu kullandığıString()biçiminde görüntülenmesi için Task üzerinde[Name]: [duration]metodunu uygulayın.main.go: Süreleriyle birlikte görevleri oluşturun ve görüntüleyin.Görevlerin 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: biçimlendirmeyi Stringer arayüzü otomatik olarak gerçekleştirecektir.Tüm görevleri yazdırdıktan sonra, tüm görevlerin toplam süresini aşağıdaki biçimde hesaplayıp yazdırın:
Total: [duration]
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Görev sayısı
- Sonraki satırlar: Görev adı ve dakika (görev başına iki satır)
Örneğin, şu veriler verildiğinde:
3
Code Review
90
Meeting
45
Documentation
120Çıktınız şu şekilde olmalıdır:
Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15mVe şu veriler verildiğinde:
2
Design
180
Testing
65Çıktınız şu şekilde olmalıdır:
Design: 3h 0m
Testing: 1h 5m
Total: 4h 5mStringer uygulayarak türleriniz Go'nun yazdırma işlevleriyle sorunsuz bir şekilde bütünleşir. {90} gibi ham yapı alanlarını görmek yerine, kullanıcılar için anlamlı olan ve anlaşılması kolay bir çıktı elde edersiniz.
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 dakikaları takip et
for i := 0; i < numTasks; i++ {
// Görev adını oku
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Görev süresini dakika cinsinden oku
minutesLine, _ := reader.ReadString('\n')
minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))
// TODO: name ve Duration ile bir Task oluştur
// TODO: Görevi yazdır (fmt.Println Stringer arayüzünü kullanacak)
// 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 PoolKendi başına pratik yap: Online Go derleyicisi