Menuliskan tipe pada setiap deklarasi — var umur int = 25 — terasa berulang karena nilai 25 sudah jelas bilangan bulat. Inferensi tipe membiarkan compiler menentukan tipe variabel dari nilai yang kita berikan, sehingga deklarasi menjadi ringkas tanpa kehilangan keamanan tipe. Tipe yang disimpulkan menetap permanen sejak kompilasi; ini bukan fitur tipe dinamis seperti di Python. Pada chapter ini kita akan melihat aturan inferensi untuk nilai literal, ekspresi konstanta, dan campuran variabel, lalu mengetahui kapan penulisan tipe eksplisit tetap diperlukan.
Aturan Dasar Inferensi #
Ketika deklarasi memberi nilai awal tanpa tipe, compiler memilih tipe dari nilai tersebut. Setiap literal punya default type: bilangan bulat menjadi int, bilangan desimal menjadi float64, teks menjadi string, dan true/false menjadi bool:
var umur = 25 // int
var suhu = 36.6 // float64
var nama = "Budi" // string
var aktif = true // boolAturan yang sama berlaku untuk deklarasi pendek := dari chapter Deklarasi Pendek
. Verb %T pada fmt.Printf akan memperlihatkan nama tipe yang dipilih compiler pada program utuh di bawah.
Inferensi dari Ekspresi Konstanta #
Ekspresi yang seluruh operannya konstanta dihitung lebih dulu dengan presisi tinggi, lalu hasilnya diinferensikan dari bentuknya. Sifat ini menghasilkan salah satu kejutan klasik Go:
pembagianBulat := 7 / 2 // int: 3
pembagianDesimal := 7.0 / 2 // float64: 3.5Karena 7 dan 2 adalah konstanta bulat, 7 / 2 menghasilkan konstanta bulat 3 — sisa bagi dibuang — dan variabelnya bertipe int. Mengubah salah satu operan menjadi 7.0 cukup untuk membuat seluruh ekspresi menghasilkan 3.5 bertipe float64.
Inferensi dari Tipe Operan #
Ketika ekspresi melibatkan variabel yang tipenya sudah ada, hasil mengikuti tipe operan tersebut. Konstanta yang ikut serta menyesuaikan diri ke tipe operan variabel:
hargaSatuan := 15000
jumlah := 3
total := hargaSatuan * jumlah // int
saldo := 500000.75
bagiTiga := saldo / 3 // float64, konstanta 3 menyesuaikanPerkalian dua variabel int menghasilkan int; pembagian variabel float64 oleh konstanta bulat menghasilkan float64 karena konstanta 3 yang untyped menyesuaikan tipe saldo.
Program Utuh #
Berkas inferensi-demo.go merangkum ketiga aturan di atas. Jalankan berkas tersebut dari direktori chapter:
go run inferensi-demo.gopackage main
import "fmt"
func main() {
var umur = 25
var suhu = 36.6
var nama = "Budi"
fmt.Printf("umur bertipe %T\n", umur)
fmt.Printf("suhu bertipe %T\n", suhu)
fmt.Printf("nama bertipe %T\n", nama)
pembagianBulat := 7 / 2
pembagianDesimal := 7.0 / 2
fmt.Println(pembagianBulat, pembagianDesimal)
hargaSatuan := 15000
jumlah := 3
total := hargaSatuan * jumlah
fmt.Printf("total bertipe %T dengan nilai %d\n", total, total)
saldo := 500000.75
bagiTiga := saldo / 3
fmt.Printf("bagiTiga bertipe %T dengan nilai %.2f\n", bagiTiga, bagiTiga)
}Output yang Dihasilkan:
umur bertipe int
suhu bertipe float64
nama bertipe string
3 3.5
total bertipe int dengan nilai 45000
bagiTiga bertipe float64 dengan nilai 166666.92Mari kita telaah baris demi baris program di atas:
- Baris 6–8 (
var umur = 25dst.): mendeklarasikan tiga variabel tanpa tipe; compiler menyimpulkanint,float64, danstringdari masing-masing nilai awal. - Baris 10–12: memakai verb
%Tuntuk mencetak nama tipe setiap variabel — bukti langsung hasil inferensi. - Baris 15–16 (
7 / 2dan7.0 / 2): memperlihatkan bahwa bentuk konstanta menentukan tipe hasil: pembagian bulat menghasilkan3, pembagian desimal menghasilkan3.5. - Baris 19–21 (
total := hargaSatuan * jumlah): menghitung hasil dari dua variabelint, sehinggatotalbertipeintbernilai 45000. - Baris 23–25 (
bagiTiga := saldo / 3): membagi variabelfloat64oleh konstanta untyped3; konstanta tersebut menyesuaikan tipefloat64sehingga hasilnya desimal.
Kapan Tipe Tetap Ditulis Eksplisit #
Inferensi tidak selalu bisa mengikuti kebutuhan program. Tiga situasi berikut tetap menuntut tipe eksplisit:
| Situasi | Contoh | Alasan |
|---|---|---|
| Butuh tipe spesifik | var port uint16 = 8080 | 8080 sendiri akan diinferensikan int |
| Variabel tanpa nilai awal | var saldo float64 | Tidak ada nilai untuk disimpulkan |
| Tipe hasil beda dari default | var rasio float32 = 0.75 | 0.75 akan jatuh ke float64 |
Mengapa Go tidak sekalian mengonversi angka secara otomatis ketika tipe berbeda? Jawabannya — beserta cara menuliskan konversi yang eksplisit — menjadi topik chapter berikutnya.
Referensi #
- Spesifikasi Go: Variables — aturan resmi inferensi tipe pada deklarasi variabel.
- Spesifikasi Go: Assignments — bagian assignability menjelaskan kapan nilai boleh masuk ke variabel bertipe tertentu.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
inferensi-demo.go
Unduh berkaspackage main
import "fmt"
func main() {
var umur = 25
var suhu = 36.6
var nama = "Budi"
fmt.Printf("umur bertipe %T\n", umur)
fmt.Printf("suhu bertipe %T\n", suhu)
fmt.Printf("nama bertipe %T\n", nama)
pembagianBulat := 7 / 2
pembagianDesimal := 7.0 / 2
fmt.Println(pembagianBulat, pembagianDesimal)
hargaSatuan := 15000
jumlah := 3
total := hargaSatuan * jumlah
fmt.Printf("total bertipe %T dengan nilai %d\n", total, total)
saldo := 500000.75
bagiTiga := saldo / 3
fmt.Printf("bagiTiga bertipe %T dengan nilai %.2f\n", bagiTiga, bagiTiga)
}