package main

import "fmt"

// format memilih perlakuan berbeda untuk setiap tipe dinamis.
func format(v any) string {
	switch nilai := v.(type) {
	case nil:
		return "(kosong)"
	case int:
		return fmt.Sprintf("bilangan bulat %d", nilai)
	case string:
		return fmt.Sprintf("teks %q", nilai)
	case []int:
		return fmt.Sprintf("slice int %v", nilai)
	case bool, float64:
		// case multi-tipe: nilai tetap bertipe any, bukan bool/float64.
		return fmt.Sprintf("tipe lain: %v (%T)", nilai, nilai)
	default:
		return fmt.Sprintf("tipe tak dikenal: %T", nilai)
	}
}

func main() {
	nilai := []any{42, "belajar", []int{1, 2, 3}, true, 3.5, nil, struct{}{}}
	for _, v := range nilai {
		fmt.Println(format(v))
	}
}
