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:

KelompokTipeRentang atau presisi
Bulat bertandaint8, int16, int32, int64−128 s.d. 127, −32.768 s.d. 32.767, ±2,1 miliar, ±9,2 kuintiliun
Bulat tak bertandauint8, uint16, uint32, uint640 s.d. 255, 0 s.d. 65.535, dst.
Menyesuaikan platformint, uintsama lebar dengan int64/uint64 pada mesin 64-bit
Desimalfloat32, float64±3,4×10³⁸ (~7 digit signifikan), ±1,8×10³⁰⁸ (~15 digit)
Komplekscomplex64, complex128pasangan 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 .

Go menerima beberapa bentuk literal angka sekaligus. Garis bawah boleh disisipkan sebagai pemisah ribuan agar angka besar mudah dibaca:

go
desimal := 275_000_000
biner   := 0b1010 // nilai 10
oktal   := 0o17   // nilai 15
heksa   := 0xFF   // nilai 255

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

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

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

text
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  : 9223372036854775807

Mari kita telaah baris demi baris program di atas:

  1. Baris 10 (penduduk := 275_000_000): mendeklarasikan bilangan bulat bertipe int (hasil inferensi) dengan pemisah ribuan agar mudah dibaca manusia.
  2. Baris 14 (suhuTubuh := 36.6): mendeklarasikan bilangan desimal yang inferensinya jatuh ke tipe float64, bukan float32.
  3. Baris 18 (pi32 := float32(math.Pi)): mengonversi konstanta float64 menjadi float32 secara eksplisit — konversi antar tipe numerik selalu ditulis tegas di Go.
  4. Baris 22 (sinyal := complex(3, 4)): membangun bilangan kompleks 3+4i; pencetakannya tampil sebagai (3+4i).
  5. Baris 25–27: membaca batas tipe dari konstanta package math — math.MaxInt8 bernilai 127 dan math.MaxInt bernilai 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 #

Berkas Sumber

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

numerik-demo.go

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