package main

import "fmt"

// Alat adalah interface dengan satu method.
type Alat interface {
	Status() string
}

// Sensor mengimplementasikan Alat lewat receiver pointer.
type Sensor struct {
	Nama string
}

func (s *Sensor) Status() string {
	if s == nil {
		return "sensor tidak terpasang"
	}
	return s.Nama + " aktif"
}

// GalatPencarian adalah tipe error konkret dengan receiver pointer.
type GalatPencarian struct {
	Pesan string
}

func (g *GalatPencarian) Error() string {
	return g.Pesan
}

// cariPengguna mengembalikan pointer nil saat pengguna ditemukan tanpa masalah.
func cariPengguna(nama string) *GalatPencarian {
	if nama == "" {
		return &GalatPencarian{Pesan: "nama kosong"}
	}
	return nil
}

func main() {
	// Kasus 1: interface nil sejati, tanpa dynamic type.
	var alatKosong Alat
	fmt.Println("alatKosong == nil:", alatKosong == nil)

	// Kasus 2: pointer nil dibungkus interface, dynamic type tetap ada.
	var sensor *Sensor = nil
	var alatTerisi Alat = sensor
	fmt.Println("alatTerisi == nil:", alatTerisi == nil)
	fmt.Println("alatTerisi.Status():", alatTerisi.Status())

	// Kasus 3: pola error yang paling sering menjadi bug di lapangan.
	galat := cariPengguna("Siti")
	fmt.Println("galat == nil:", galat == nil)
	var err error = galat
	fmt.Println("err == nil:", err == nil)
}
