Antarmuka fmt.Stringer
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 75 dari 107.
Interface fmt.Stringer mengatur tampilan tipe-tipe kamu saat dicetak. Interface ini adalah salah satu interface yang paling umum diimplementasikan di Go, dan didefinisikan dalam package fmt:
type Stringer interface {
String() string
}Saat kamu memberikan nilai ke fmt.Println, fmt.Printf dengan %v, atau fungsi serupa, Go memeriksa apakah tipe tersebut mengimplementasikan Stringer. Jika ya, Go memanggil method String() untuk mendapatkan representasi teks.
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
}Tanpa method String(), pencetakan akan menampilkan format struct default: {23.5}. Dengan mengimplementasikan Stringer, kamu mengontrol dengan tepat bagaimana tipe milikmu ditampilkan.
Ini sangat berguna untuk tipe yang nilai field mentahnya tidak menyampaikan makna dengan jelas. Tipe Duration mungkin ditampilkan sebagai "2h 30m" alih-alih menampilkan nanodetik mentah, atau tipe User mungkin menampilkan nama yang diformat alih-alih semua field-nya.
Tantangan
MudahMari buat sistem pelacakan waktu yang menampilkan durasi dalam format yang mudah dipahami! Kamu akan mengimplementasikan antarmuka fmt.Stringer untuk mengatur tampilan tipe buatanmu saat dicetak.
Kamu akan menyusun kodemu dalam dua file:
duration.go: Definisikan tipe terkait waktu dengan representasi string khusus.Buat struct
Durationyang menyimpan total menit sebagai bilangan bulat. Implementasikan methodString()agar saat dicetak, durasinya ditampilkan dalam format yang mudah dibaca, seperti2h 30muntuk 150 menit, atau0h 45muntuk 45 menit. Jam dan menit harus selalu ditampilkan.Buat struct
Taskdengan fieldName(string) danTime(Duration). ImplementasikanString()pada Task agar ditampilkan dalam format[Name]: [duration], dengan durasi yang menggunakan method String miliknya sendiri.main.go: Buat dan tampilkan tugas beserta durasinya.Baca jumlah tugas, lalu untuk setiap tugas, baca namanya dan durasinya dalam menit. Buat instance Task dan cetak masing-masing secara langsung menggunakan
fmt.Println: antarmuka Stringer akan menangani pemformatan secara otomatis.Setelah mencetak semua tugas, hitung dan cetak total waktu semua tugas dengan format:
Total: [duration]
Input berikut akan diberikan:
- Baris 1: Jumlah tugas
- Baris berikutnya: Nama tugas dan menit (dua baris untuk setiap tugas)
Contohnya, jika diberikan:
3
Code Review
90
Meeting
45
Documentation
120Outputmu harus berupa:
Code Review: 1h 30m
Meeting: 0h 45m
Documentation: 2h 0m
Total: 4h 15mDan jika diberikan:
2
Design
180
Testing
65Outputmu harus berupa:
Design: 3h 0m
Testing: 1h 5m
Total: 4h 5mDengan mengimplementasikan Stringer, tipemu dapat digunakan dengan lancar bersama fungsi pencetakan Go. Alih-alih melihat field struct mentah seperti {90}, kamu akan mendapatkan output bermakna yang mudah dipahami pengguna.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Baca jumlah tugas
line, _ := reader.ReadString('\n')
numTasks, _ := strconv.Atoi(strings.TrimSpace(line))
// TODO: Buat slice untuk menyimpan tugas
// TODO: Catat total menit
for i := 0; i < numTasks; i++ {
// Baca nama tugas
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Baca durasi tugas dalam menit
minutesLine, _ := reader.ReadString('\n')
minutes, _ := strconv.Atoi(strings.TrimSpace(minutesLine))
// TODO: Buat Task dengan nama dan Duration
// TODO: Cetak tugas (fmt.Println akan menggunakan interface Stringer)
// TODO: Tambahkan minutes ke total
_ = name
_ = minutes
}
// TODO: Cetak total durasi dalam format "Total: Xh Ym"
}
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 File11Pustaka Standar & OOP
io.Reader & io.Writersort.InterfaceAntarmuka fmt.Stringerencoding/json dengan StructAntarmuka http.HandlerRingkasan, Model REST API3Pointer 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