Özet - Dosya Ayrıştırıcı
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 58 / 107.
Görev
KolayBu bölümdeki tüm hata işleme tekniklerini bir araya getiren bir yapılandırma dosyası ayrıştırıcısı (parser) oluşturalım. Ayrıştırıcınız; özel hata türleri, sentinel hatalar, hata sarmalama (error wrapping) ve defer kullanarak uygun temizleme işlemleri ile birden fazla başarısızlık senaryosunu yönetecek.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
errors.go: Ayrıştırıcı için hata altyapınızı tanımlayın.İki adet sentinel hata oluşturun:
"file content is empty"mesajıylaErrEmptyContent"invalid configuration format"mesajıylaErrInvalidFormat
Line(int) veMessage(string) alanlarına sahip özel bir hata türü olanParseErroroluşturun. Bu türünError()metodu şu sonucu döndürmelidir:parse error at line [Line]: [Message]parser.go: Katmanlı hata işleme özelliğine sahip yapılandırma ayrıştırıcısını oluşturun.Ayrıştırmanın başarıyla tamamlanıp tamamlanmadığını takip etmek için
parsedadında boolean bir alana sahipConfigParserstruct'ını oluşturun.Şu metotları uygulayın:
NewConfigParser() *ConfigParser-parseddeğerifalseolarak ayarlanmış yeni bir ayrıştırıcı oluşturur.ParseLine(lineNum int, line string) error- tek bir satırı doğrular. Eğer satır bir=karakteri içermiyorsa, satır numarasını ve"missing key-value separator"mesajını içeren bir*ParseErrordöndürün. Aksi takdirdenildöndürün.Parse(content string) error- ana ayrıştırma metodudur ve şunları yapar:- İçerik boşsa
ErrEmptyContentdöndürür - İçerik en az bir yeni satır karakteri içermiyorsa
ErrInvalidFormatdöndürür - İçeriği yeni satırlara göre böler ve her satır için
ParseLinemetodunu çağırır (satır numaraları 1'den başlar) - Eğer
ParseLinebir hata döndürürse, bunu"parsing configuration: %w"ile sarmalayın ve döndürün - Başarı durumunda
parseddeğerinitrueyapar venildöndürür
- İçerik boşsa
Status() string- eğerparsedtrue ise"ready", aksi takdirde"not parsed"döndürür
main.go: Yapılandırma içeriğini okuyun ve kapsamlı hata incelemesini gösterin.Birlikte yapılandırma içeriğini oluşturan iki satırlık girdi okuyun (bunları bir yeni satır karakteri ile birleştirin). Başarı veya başarısızlık durumuna bakılmaksızın, ayrıştırıcının durumunu sonunda her zaman yazdırmak için
deferkullanın.Ayrıştırma denemesinden sonra, neyin yanlış gittiğine bağlı olarak özel geri bildirim sağlamak için hem
errors.Is()hem deerrors.As()kullanarak hataları inceleyin.
Aşağıdaki girdiler sağlanacaktır:
- Satır 1: Yapılandırma içeriğinin ilk satırı
- Satır 2: Yapılandırma içeriğinin ikinci satırı
Hataları belirli mesajlarla ele alın:
- Eğer
errors.Is(),ErrEmptyContentbulursa:Error: No configuration providedyazdırın - Eğer
errors.Is(),ErrInvalidFormatbulursa:Error: Configuration must have multiple linesyazdırın - Eğer
errors.As(), bir*ParseErrorbulursa: tam sarmalanmış hatayı yazdırın, ardından yeni bir satırdaFix line [Line]: [Message]yazdırın - Ayrıştırma başarılı olursa:
Configuration parsed successfullyyazdırın
Sonucu (başarı veya hata) işledikten sonra, ertelenmiş (deferred) durum yeni bir satırda yazdırılmalıdır: Parser status: [status]
Örneğin, host=localhost ve port=8080 verildiğinde çıktınız şöyle olmalıdır:
Configuration parsed successfully
Parser status: readyVe host=localhost ile invalid line verildiğinde çıktınız şöyle olmalıdır:
parsing configuration: parse error at line 2: missing key-value separator
Fix line 2: missing key-value separator
Parser status: not parsedKendin dene
package main
import (
"bufio"
"errors"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Yapılandırmanın ilk satırını oku
line1, _ := reader.ReadString('\n')
line1 = line1[:len(line1)-1] // Sondaki yeni satır karakterini kaldır
// Yapılandırmanın ikinci satırını oku
line2, _ := reader.ReadString('\n')
if len(line2) > 0 && line2[len(line2)-1] == '\n' {
line2 = line2[:len(line2)-1]
}
// Yapılandırma içeriğini oluşturmak için iki satırı bir yeni satır karakteriyle birleştir
content := line1 + "\n" + line2
// Yeni bir ayrıştırıcı (parser) oluştur
parser := NewConfigParser()
// TODO: Sonunda her zaman ayrıştırıcının durumunu yazdırmak için defer kullanın
// Biçim: "Parser status: [status]"
// TODO: İçeriği ayrıştırmayı deneyin
// TODO: errors.Is() ve errors.As() kullanarak hataları ele alın
// - Eğer errors.Is() ErrEmptyContent bulursa: "Error: No configuration provided" yazdırın
// - Eğer errors.Is() ErrInvalidFormat bulursa: "Error: Configuration must have multiple lines" yazdırın
// - Eğer errors.As() bir *ParseError bulursa: sarmalanmış hatanın tamamını yazdırın,
// ardından yeni bir satırda "Fix line [Line]: [Message]" yazdırın
// - Eğer ayrıştırma başarılı olursa: "Configuration parsed successfully" yazdırın
_ = errors.Is // ipucu: sentinel hatalar için errors.Is kullanın
_ = errors.As // ipucu: özel hata türleri için errors.As kullanın
_ = fmt.Println
}
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