Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 struct Temperature dengan field Value (float64) dan Unit (string). Implementasikan method String() agar suhu ditampilkan dalam format yang mudah dibaca saat dicetak. Buat juga struct TemperatureError dengan field Temp (float64) dan Reason (string), lalu implementasikan method Error() untuk memberikan pesan error yang deskriptif.
  • main.go: Buat fungsi bernama ValidateTemperature yang menerima Temperature dan 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 mengembalikan nil. Baca data suhu dari input, buat Temperature, validasi, lalu cetak output yang sesuai.

Input berikut akan diberikan:

  • Baris 1: Nilai suhu (float)
  • Baris 2: Satuan (C untuk Celsius atau F untuk 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 Celsius

Jika diberikan -500 dan F, outputmu seharusnya:

invalid temperature -500: below absolute zero

Gunakan "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())
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online