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:

go
var umur = 25    // int
var suhu = 36.6  // float64
var nama = "Budi" // string
var aktif = true // bool

Aturan 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:

go
pembagianBulat := 7 / 2   // int: 3
pembagianDesimal := 7.0 / 2 // float64: 3.5

Karena 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:

go
hargaSatuan := 15000
jumlah := 3
total := hargaSatuan * jumlah // int

saldo := 500000.75
bagiTiga := saldo / 3 // float64, konstanta 3 menyesuaikan

Perkalian 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:

bash
go run inferensi-demo.go
go
package 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:

text
umur bertipe int
suhu bertipe float64
nama bertipe string
3 3.5
total bertipe int dengan nilai 45000
bagiTiga bertipe float64 dengan nilai 166666.92

Mari kita telaah baris demi baris program di atas:

  1. Baris 6–8 (var umur = 25 dst.): mendeklarasikan tiga variabel tanpa tipe; compiler menyimpulkan int, float64, dan string dari masing-masing nilai awal.
  2. Baris 10–12: memakai verb %T untuk mencetak nama tipe setiap variabel — bukti langsung hasil inferensi.
  3. Baris 15–16 (7 / 2 dan 7.0 / 2): memperlihatkan bahwa bentuk konstanta menentukan tipe hasil: pembagian bulat menghasilkan 3, pembagian desimal menghasilkan 3.5.
  4. Baris 19–21 (total := hargaSatuan * jumlah): menghitung hasil dari dua variabel int, sehingga total bertipe int bernilai 45000.
  5. Baris 23–25 (bagiTiga := saldo / 3): membagi variabel float64 oleh konstanta untyped 3; konstanta tersebut menyesuaikan tipe float64 sehingga hasilnya desimal.

Kapan Tipe Tetap Ditulis Eksplisit #

Inferensi tidak selalu bisa mengikuti kebutuhan program. Tiga situasi berikut tetap menuntut tipe eksplisit:

SituasiContohAlasan
Butuh tipe spesifikvar port uint16 = 80808080 sendiri akan diinferensikan int
Variabel tanpa nilai awalvar saldo float64Tidak ada nilai untuk disimpulkan
Tipe hasil beda dari defaultvar rasio float32 = 0.750.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 #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

inferensi-demo.go

Unduh berkas
go
package 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)
}