Angka adalah data yang paling sering diolah program: jumlah barang, harga, berat, suhu, hingga koordinat GPS. Go menyediakan keluarga tipe numerik yang beragam — bilangan bulat bertanda dan tak bertanda, bilangan desimal, hingga bilangan kompleks — dan menyerahkan pilihan tipe kepada kita dengan konsekuensi yang jelas: rentang nilai dan presisi. Pada chapter ini kita akan memetakan seluruh keluarga tipe numerik, membandingkan presisi float32 dengan float64, lalu menetapkan aturan praktis memilih tipe untuk kasus sehari-hari.
Keluarga Tipe Numerik #
Tabel berikut merangkum seluruh kelompok tipe numerik beserta rentangnya pada platform 64-bit:
| Kelompok | Tipe | Rentang atau presisi |
|---|---|---|
| Bulat bertanda | int8, int16, int32, int64 | −128 s.d. 127, −32.768 s.d. 32.767, ±2,1 miliar, ±9,2 kuintiliun |
| Bulat tak bertanda | uint8, uint16, uint32, uint64 | 0 s.d. 255, 0 s.d. 65.535, dst. |
| Menyesuaikan platform | int, uint | sama lebar dengan int64/uint64 pada mesin 64-bit |
| Desimal | float32, float64 | ±3,4×10³⁸ (~7 digit signifikan), ±1,8×10³⁰⁸ (~15 digit) |
| Kompleks | complex64, complex128 | pasangan bilangan riil-imajiner float32/float64 |
Tipe int adalah bilangan bulat bertanda yang lebarnya mengikuti arsitektur mesin: 64-bit pada komputer modern, 32-bit pada perangkat kecil. Tipe uint adalah pasangan tak bertandanya. Dua alias juga termasuk keluarga ini: byte adalah nama lain uint8 dan rune adalah nama lain int32, keduanya akan sering kita jumpai pada chapter String dan Rune
serta Byte dan Encoding
.
Menulis Nilai Numerik #
Go menerima beberapa bentuk literal angka sekaligus. Garis bawah boleh disisipkan sebagai pemisah ribuan agar angka besar mudah dibaca:
desimal := 275_000_000
biner := 0b1010 // nilai 10
oktal := 0o17 // nilai 15
heksa := 0xFF // nilai 255Bentuk biner 0b, oktal 0o, dan heksadesimal 0x banyak dipakai saat bekerja dengan data mentah di level byte. Untuk kebutuhan sehari-hari, bentuk desimal dengan pemisah _ sudah lebih dari cukup.
Presisi float32 dan float64 #
Perbedaan paling nyata antara kedua tipe desimal terlihat pada jumlah digit signifikan yang bisa disimpan. Program di bawah menyimpan konstanta math.Pi pada kedua tipe, lalu mencetak kembali nilainya:
pi64 := math.Pi
pi32 := float32(math.Pi)Nilai float64 mencetak 3.141592653589793 dengan 15 digit signifikan, sedangkan float32 hanya sanggup menyimpan 3.1415927. Kehilangan digit ini fatal untuk perhitungan keuangan atau ilmiah, sehingga float64 adalah pilihan default untuk bilangan desimal; float32 dipakai ketika memori menjadi kendala nyata, misalnya pada array berisi jutaan elemen.
Program Utuh #
Berkas numerik-demo.go mendemonstrasikan seluruh keluarga tipe beserta batas nilainya. Jalankan berkas tersebut dari direktori chapter:
go run numerik-demo.gopackage main
import (
"fmt"
"math"
)
func main() {
penduduk := 275_000_000
fmt.Println("Penduduk Indonesia:", penduduk)
jarakBulanKm := 384400
fmt.Println("Jarak ke bulan (km):", jarakBulanKm)
suhuTubuh := 36.6
fmt.Println("Suhu tubuh:", suhuTubuh)
pi64 := math.Pi
pi32 := float32(math.Pi)
fmt.Println("math.Pi float64:", pi64)
fmt.Println("math.Pi float32:", pi32)
sinyal := complex(3, 4)
fmt.Println("Amplitudo sinyal:", sinyal)
fmt.Println("Batas atas int8 :", math.MaxInt8)
fmt.Println("Batas bawah int8:", math.MinInt8)
fmt.Println("Batas atas int :", math.MaxInt)
}Output yang Dihasilkan:
Penduduk Indonesia: 275000000
Jarak ke bulan (km): 384400
Suhu tubuh: 36.6
math.Pi float64: 3.141592653589793
math.Pi float32: 3.1415927
Amplitudo sinyal: (3+4i)
Batas atas int8 : 127
Batas bawah int8: -128
Batas atas int : 9223372036854775807Mari kita telaah baris demi baris program di atas:
- Baris 10 (
penduduk := 275_000_000): mendeklarasikan bilangan bulat bertipeint(hasil inferensi) dengan pemisah ribuan agar mudah dibaca manusia. - Baris 14 (
suhuTubuh := 36.6): mendeklarasikan bilangan desimal yang inferensinya jatuh ke tipefloat64, bukanfloat32. - Baris 18 (
pi32 := float32(math.Pi)): mengonversi konstantafloat64menjadifloat32secara eksplisit — konversi antar tipe numerik selalu ditulis tegas di Go. - Baris 22 (
sinyal := complex(3, 4)): membangun bilangan kompleks 3+4i; pencetakannya tampil sebagai(3+4i). - Baris 25–27: membaca batas tipe dari konstanta package
math—math.MaxInt8bernilai 127 danmath.MaxIntbernilai 9.223.372.036.854.775.807 pada mesin 64-bit.
Aturan Praktis Memilih Tipe #
Gunakan int untuk seluruh bilangan bulat kecuali ada alasan khusus, dan float64 untuk seluruh bilangan desimal. Tipe berukuran tetap seperti uint16 atau int32 baru dibutuhkan ketika format data sudah ditentukan pihak luar — nomor port jaringan (uint16), field protokol (uint32), atau berkas biner dengan lebar kolom tetap. Tipe uint umumnya muncul di kode sistem yang benar-benar menghitung ukuran memori atau indeks tak mungkin negatif.
Setelah mengetahui jenis angka yang tersedia, kita berpindah ke tipe yang menyimpan teks — dan menemukan bahwa string Go memiliki karakter UTF-8 yang menyimpan data jauh lebih menarik dari sekadar deretan huruf.
Referensi #
- Spesifikasi Go: Numeric types — daftar resmi rentang setiap tipe numerik.
- Dokumentasi package math
— konstanta batas seperti
MaxInt8danMaxFloat64.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
numerik-demo.go
Unduh berkaspackage main
import (
"fmt"
"math"
)
func main() {
penduduk := 275_000_000
fmt.Println("Penduduk Indonesia:", penduduk)
jarakBulanKm := 384400
fmt.Println("Jarak ke bulan (km):", jarakBulanKm)
suhuTubuh := 36.6
fmt.Println("Suhu tubuh:", suhuTubuh)
pi64 := math.Pi
pi32 := float32(math.Pi)
fmt.Println("math.Pi float64:", pi64)
fmt.Println("math.Pi float32:", pi32)
sinyal := complex(3, 4)
fmt.Println("Amplitudo sinyal:", sinyal)
fmt.Println("Batas atas int8 :", math.MaxInt8)
fmt.Println("Batas bawah int8:", math.MinInt8)
fmt.Println("Batas atas int :", math.MaxInt)
}