Interface Stringer & Error
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 32 dari 107.
Standard library Go mendefinisikan dua interface yang akan sering kamu gunakan: fmt.Stringer dan error. Keduanya adalah interface sederhana dengan satu method yang membuat tipe buatanmu dapat terintegrasi dengan kuat ke fungsionalitas bawaan Go.
Interface Stringer berada di package fmt dan hanya memerlukan satu method:
type Stringer interface {
String() string
}Saat kamu menerapkan String() pada tipe milikmu, fungsi seperti fmt.Println otomatis menggunakannya untuk menampilkan nilaimu:
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%s (%d years old)", p.Name, p.Age)
}
func main() {
p := Person{Name: "Alice", Age: 30}
fmt.Println(p) // Alice (30 tahun)
}Interface error juga sama sederhananya, hanya memerlukan method Error() yang mengembalikan string:
type error interface {
Error() string
}Tipe apa pun yang memiliki method Error() dapat digunakan sebagai nilai error di Go. Dengan demikian, kamu dapat membuat tipe error khusus dengan konteks tambahan:
type ValidationError struct {
Field string
Message string
}
func (e ValidationError) Error() string {
return fmt.Sprintf("%s: %s", e.Field, e.Message)
}
func main() {
err := ValidationError{Field: "email", Message: "invalid format"}
fmt.Println(err) // email: invalid format
}Kedua interface ini menunjukkan filosofi Go: interface yang kecil dan terfokus, yang memungkinkan perilaku hebat melalui implementasi implisit.
Tantangan
MudahMari buat sistem pemantauan suhu yang menggunakan antarmuka Stringer dan error untuk menampilkan output yang mudah dibaca dan menangani error secara bermakna.
Kamu akan mengatur kodemu di dua file:
temperature.go: Buat structTemperaturedengan fieldValue(float64) danUnit(string). Implementasikan methodString()agar suhu ditampilkan dalam format yang mudah dibaca saat dicetak. Buat juga structTemperatureErrordengan fieldTemp(float64) danReason(string), lalu implementasikan methodError()untuk memberikan pesan error yang deskriptif.main.go: Buat fungsi bernamaValidateTemperatureyang menerimaTemperaturedan mengembalikan error jika suhunya tidak valid. Suhu tidak valid jika berada di bawah nol mutlak (-273.15 untuk Celsius, -459.67 untuk Fahrenheit). Jika valid, fungsi mengembalikannil. Baca data suhu dari input, buatTemperature, validasi, lalu cetak output yang sesuai.
Input berikut akan diberikan:
- Baris 1: Nilai suhu (float)
- Baris 2: Satuan (
Cuntuk Celsius atauFuntuk Fahrenheit)
Method String()-mu harus mengembalikan format:
[Value] degrees [Unit]Unit adalah kata lengkap "Celsius" atau "Fahrenheit" berdasarkan input.
Method Error()-mu harus mengembalikan format:
invalid temperature [Temp]: [Reason]Jika suhunya valid, cetak Temperature menggunakan fmt.Println (yang akan menggunakan method String()-mu). Jika tidak valid, cetak error (yang akan menggunakan method Error()-mu).
Misalnya, jika diberikan 25.5 dan C, outputmu seharusnya:
25.5 degrees CelsiusJika diberikan -500 dan F, outputmu seharusnya:
invalid temperature -500: below absolute zeroGunakan "below absolute zero" sebagai alasan ketika suhu terlalu rendah.
Coba sendiri
package main
import (
"fmt"
)
// ValidateTemperature memeriksa apakah suhu valid
// Mengembalikan error jika suhu di bawah nol mutlak
// Nol mutlak: -273.15 untuk Celsius, -459.67 untuk Fahrenheit
func ValidateTemperature(t Temperature) error {
// TODO: Terapkan logika validasi
// Periksa apakah suhu di bawah nol mutlak berdasarkan satuannya
// Kembalikan TemperatureError jika tidak valid, nil jika valid
return nil
}
func main() {
var value float64
var unit string
fmt.Scanln(&value)
fmt.Scanln(&unit)
// TODO: Buat struct Temperature dengan nilai input
// TODO: Validasi suhu menggunakan ValidateTemperature
// TODO: Jika ada error, cetak error tersebut
// Jika tidak, cetak suhu (yang akan menggunakan method String())
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
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