package main

import "fmt"

// Stringer adalah tiruan kecil dari fmt.Stringer.
type Stringer interface {
	String() string
}

type Sensor struct {
	Nama string
	Suhu float64
}

func (s Sensor) String() string {
	return fmt.Sprintf("%s: %.1f derajat", s.Nama, s.Suhu)
}

func main() {
	var nilai any = Sensor{Nama: "Ruang Server", Suhu: 21.5}

	// Bentuk comma-ok: aman, ok bernilai false tanpa panic.
	sensor, ok := nilai.(Sensor)
	fmt.Println("ok:", ok, "sensor:", sensor)

	// Kombinasi comma-ok dalam if untuk cabang yang hanya dipakai bila cocok.
	if s, ok := nilai.(Sensor); ok {
		fmt.Println("suhu ruangan:", s.Suhu)
	} else {
		fmt.Println("nilai bukan Sensor")
	}

	// Type assertion ke interface: apakah tipe dinamis mengimplementasikan Stringer?
	if s, ok := nilai.(Stringer); ok {
		fmt.Println(s.String())
	}

	// Tipe yang tidak cocok cukup menghasilkan ok = false.
	if teks, ok := nilai.(string); ok {
		fmt.Println("teks:", teks)
	} else {
		fmt.Println("nilai bukan string, lanjut tanpa panic")
	}
}
