Rangkuman: Parser File
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 58 dari 107.
Tantangan
MudahMari buat parser file konfigurasi yang menggabungkan semua teknik penanganan error dari bab ini. Parser-mu akan menangani beberapa skenario kegagalan dengan tipe error khusus, error sentinel, pembungkusan error, dan pembersihan yang tepat menggunakan defer.
Kamu akan mengatur kodemu dalam tiga file:
errors.go: Definisikan infrastruktur error untuk parser.Buat dua error sentinel:
ErrEmptyContentdengan pesan"file content is empty"ErrInvalidFormatdengan pesan"invalid configuration format"
Buat tipe error khusus
ParseErrordengan fieldLine(int) danMessage(string). MethodError()-nya harus mengembalikan:parse error at line [Line]: [Message]parser.go: Buat parser konfigurasi dengan penanganan error berlapis.Buat struct
ConfigParserdengan field booleanparseduntuk melacak apakah parsing selesai dengan sukses.Implementasikan method berikut:
NewConfigParser() *ConfigParser- membuat parser baru denganparsedbernilaifalseParseLine(lineNum int, line string) error- memvalidasi satu baris. Jika baris tidak berisi karakter=, kembalikan*ParseErrordengan nomor baris dan pesan"missing key-value separator". Jika tidak, kembalikannil.Parse(content string) error- method parsing utama yang:- Mengembalikan
ErrEmptyContentjika content kosong - Mengembalikan
ErrInvalidFormatjika content tidak berisi setidaknya satu karakter baris baru - Memisahkan content berdasarkan baris baru dan memanggil
ParseLineuntuk setiap baris (nomor baris dimulai dari 1) - Jika
ParseLinemengembalikan error, bungkus dengan"parsing configuration: %w"lalu kembalikan - Mengatur
parsedmenjaditruesaat berhasil, lalu mengembalikannil
- Mengembalikan
Status() string- mengembalikan"ready"jikaparsedbernilai true, jika tidak"not parsed"
main.go: Baca content konfigurasi dan tunjukkan pemeriksaan error secara menyeluruh.Baca dua baris input yang bersama-sama membentuk content konfigurasi (gabungkan dengan baris baru). Gunakan
deferuntuk selalu mencetak status parser di akhir, baik berhasil maupun gagal.Setelah mencoba melakukan parsing, periksa error menggunakan
errors.Is()danerrors.As()untuk memberikan respons khusus berdasarkan penyebabnya.
Input berikut akan diberikan:
- Baris 1: Baris pertama content konfigurasi
- Baris 2: Baris kedua content konfigurasi
Tangani error dengan pesan khusus:
- Jika
errors.Is()menemukanErrEmptyContent: cetakError: No configuration provided - Jika
errors.Is()menemukanErrInvalidFormat: cetakError: Configuration must have multiple lines - Jika
errors.As()menemukan*ParseError: cetak error terbungkus secara lengkap, lalu pada baris baru cetakFix line [Line]: [Message] - Jika parsing berhasil: cetak
Configuration parsed successfully
Setelah menangani hasilnya (berhasil atau error), status yang ditunda harus dicetak pada baris baru: Parser status: [status]
Misalnya, jika diberikan host=localhost dan port=8080, output-mu seharusnya:
Configuration parsed successfully
Parser status: readyDan jika diberikan host=localhost dan invalid line, output-mu seharusnya:
parsing configuration: parse error at line 2: missing key-value separator
Fix line 2: missing key-value separator
Parser status: not parsedCoba sendiri
package main
import (
"bufio"
"errors"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca baris pertama konfigurasi
line1, _ := reader.ReadString('\n')
line1 = line1[:len(line1)-1] // Hapus newline di akhir
// Baca baris kedua konfigurasi
line2, _ := reader.ReadString('\n')
if len(line2) > 0 && line2[len(line2)-1] == '\n' {
line2 = line2[:len(line2)-1]
}
// Gabungkan kedua baris dengan newline untuk membentuk isi konfigurasi
content := line1 + "\n" + line2
// Buat parser baru
parser := NewConfigParser()
// TODO: Gunakan defer agar status parser selalu dicetak di akhir
// Format: "Parser status: [status]"
// TODO: Coba parse isinya
// TODO: Tangani error menggunakan errors.Is() dan errors.As()
// Jika errors.Is() menemukan ErrEmptyContent: cetak "Error: No configuration provided"
// Jika errors.Is() menemukan ErrInvalidFormat: cetak "Error: Configuration must have multiple lines"
// Jika errors.As() menemukan *ParseError: cetak seluruh error yang dibungkus,
// lalu cetak "Fix line [Line]: [Message]" di baris baru
// - Jika parsing berhasil: cetak "Configuration parsed successfully"
_ = errors.Is // petunjuk: gunakan errors.Is untuk error sentinel
_ = errors.As // petunjuk: gunakan errors.As untuk tipe error kustom
_ = fmt.Println
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP di Go
File EksternalWorkspace Go dan modulePaket dan ImporNama yang Diekspor dan Tidak DieksporPengantar OOP di Gostruct sebagai classMendefinisikan method pada structPointer receiver vs value receiverInisialisasi structFungsi KonstruktorUlasan: Kalkulator Sederhana4Interface
Pengenalan InterfaceImplementasi ImplisitInterface sebagai KontrakInterface Kosong (any)Type AssertionType SwitchKomposisi InterfaceInterface Stringer & ErrorUlasan: Kalkulator Bentuk7Enkapsulasi
Field yang Diekspor vs Tidak DieksporEnkapsulasi Tingkat PackageMethod Getter dan SetterPenyembunyian Informasi di GoRingkasan: Data Siswa10Generics (Go 1.18+)
Pengantar GenericsParameter TipeBatasan TipeStruct GenerikCara Alternatif untuk Method GenerikRingkasan Koleksi Generik2Mendalami Tipe dan Struct
Tipe Dasar dan KompositDefinisi Tipe KustomTag StructStruct AnonimStruct BersarangNilai Nol dan Nilai BawaanRangkuman: Buku Kontak5Komposisi daripada Pewarisan
Mengapa Go Tidak Memiliki PewarisanDasar Penyematan StructPromosi methodMenyematkan Beberapa StructPenyematan vs AgregasiMembayangi method yang DisematkanRangkuman: Hierarki Karyawan8Penanganan Error & OOP
Interface errorTipe Error KustomPembungkusan Error (fmt.Errorf)Error Sentinelerrors.Is() dan errors.As()Panic, Defer, dan RecoverRangkuman: Parser File3Pointer dan Memori
Dasar-Dasar Pointer di GoPointer ke StructPass by Value vs ReferenceFungsi new()Garbage Collection di GoRekap: Pembuat Linked List6Polimorfisme di Go
Polimorfisme melalui InterfaceDuck Typing di GoAturan Pemenuhan InterfaceKoleksi PolimorfikInjeksi DependensiRangkuman: Pemroses Pembayaran9Konkruensi & OOP
Dasar-dasar GoroutineChannel & KomunikasiChannel Ber-buffer vs Tanpa BufferPernyataan selectsync.Mutex & sync.RWMutexsync.WaitGroupDesain Struct yang Aman untuk ThreadRingkasan: Worker PoolLatihan sendiri: Compiler Go online