Setiap nilai di Go memiliki tepat satu tipe yang menentukan ukuran memori, operasi yang sah, dan nilai awalnya. Go tidak memiliki konversi implisit antar tipe, sehingga menghafal daftar tipe bawaan beserta rentangnya menghemat banyak waktu debugging. Chapter ini merangkum seluruh tipe bawaan — dari bool hingga complex128 — beserta zero value, rentang nilai numerik, dan tipe komposit yang dibangun darinya. Seluruh angka pada tabel di bawah telah diverifikasi dengan program pada bagian akhir chapter.
Tipe Boolean dan String #
Dua tipe fundamental ini menjadi fondasi hampir setiap program. Keduanya dibahas mendalam pada chapter Variabel dan String dan Rune .
| Tipe | Zero value | Keterangan |
|---|---|---|
bool | false | Hanya bernilai true atau false; tidak bisa dikonversi dari angka |
string | "" | Rangkaian byte UTF-8 yang tidak dapat diubah (immutable) |
Perlu dicatat bahwa len pada string menghitung byte, bukan jumlah karakter — string berisi teks non-ASCII bisa berisi lebih banyak byte daripada karakter yang terlihat.
Tipe Bilangan Bulat #
Go membedakan tipe bertanda (int) dan tak bertanda (uint) dalam empat lebar bit. Tipe byte dan rune adalah alias yang membuat niat kode lebih jelas: byte untuk data mentah, rune untuk karakter Unicode.
| Tipe | Zero value | Rentang nilai |
|---|---|---|
int | 0 | Minimal 32 bit; pada platform 64-bit seperti amd64 setara int64 |
int8 | 0 | -128 sampai 127 |
int16 | 0 | -32768 sampai 32767 |
int32 | 0 | -2147483648 sampai 2147483647 |
int64 | 0 | -9223372036854775808 sampai 9223372036854775807 |
uint | 0 | Minimal 32 bit; pada platform 64-bit setara uint64 |
uint8 | 0 | 0 sampai 255 |
uint16 | 0 | 0 sampai 65535 |
uint32 | 0 | 0 sampai 4294967295 |
uint64 | 0 | 0 sampai 18446744073709551615 |
uintptr | 0 | Cukup besar untuk menyimpan bit pola pointer |
byte | 0 | Alias uint8 |
rune | 0 | Alias int32; satu titik kode Unicode |
Nilai di luar rentang akan ditolak compiler, bukan dibungkus diam-diam — percobaan memasukkan 200 ke int8 menghasilkan pesan overflows yang dibahas pada chapter Compiler Error
. Praktik umum: gunakan int untuk bilangan bulat biasa, dan tipe berlebar tetap hanya saat format data memang mensyaratkan (protokol biner, penyimpanan hemat memori).
Tipe Floating-Point dan Kompleks #
| Tipe | Zero value | Rentang nilai |
|---|---|---|
float32 | 0 | Sekitar ±1.4e-45 sampai ±3.4e38; presisi sekitar 7 digit desimal |
float64 | 0 | Sekitar ±4.9e-324 sampai ±1.8e308; presisi sekitar 15 digit desimal |
complex64 | 0 | Bilangan kompleks dari dua float32 |
complex128 | 0 | Bilangan kompleks dari dua float64 |
Angka floating-point mengikuti standar IEEE 754, sehingga operasi seperti pembagian dengan nol menghasilkan +Inf, bukan panic. Untuk perhitungan uang atau nilai yang harus tepat, gunakan representasi bilangan bulat (misalnya jumlah rupiah dalam int64), bukan floating-point.
Tipe Komposit #
Tipe komposit dibangun dari tipe dasar. Zero value-nya konsisten: tipe referensi menjadi nil, sedangkan array dan struct diisi zero value di setiap elemen atau field-nya.
| Tipe | Bentuk deklarasi | Zero value |
|---|---|---|
| Array | [3]int | Semua elemen berisi zero value |
| Slice | []int | nil (panjang 0, tanpa array dasar) |
| Map | map[string]int | nil (baca aman, tulis panic) |
| Struct | struct { Nama string } | Setiap field berisi zero value |
| Pointer | *int | nil |
| Function | func() | nil |
| Channel | chan int | nil |
| Interface | interface{} / any | nil |
Tiga identifier tipe terpasang melengkapi daftar ini: error (interface satu method Error() string), any (alias interface{}), dan comparable (constraint untuk tipe yang bisa dibandingkan dengan ==). Ketiganya bukan keyword — pembahasan lengkapnya ada di chapter Interface
.
Membuktikan Zero Value dan Rentang #
Berkas zero-value-demo.go mendeklarasikan sepuluh tipe dalam satu blok var tanpa nilai awal, lalu mencetak isi serta batas numerik dari konstanta package math:
package main
import (
"fmt"
"math"
)
func main() {
var (
aktif bool
nama string
jumlah int
rasio float64
ptr *int
daftar []int
indeks map[string]int
fungsi func()
saluran chan int
pengguna struct {
Nama string
Umur int
}
)
fmt.Printf("bool : %v\n", aktif)
fmt.Printf("string : %q\n", nama)
fmt.Printf("int : %v\n", jumlah)
fmt.Printf("float64 : %v\n", rasio)
fmt.Printf("*int : %#v\n", ptr)
fmt.Printf("[]int : %#v\n", daftar)
fmt.Printf("map : %#v\n", indeks)
fmt.Printf("func : %#v\n", fungsi)
fmt.Printf("chan : %#v\n", saluran)
fmt.Printf("struct : %#v\n", pengguna)
fmt.Println("int8 :", math.MinInt8, "sampai", math.MaxInt8)
fmt.Println("uint8 : 0 sampai", math.MaxUint8)
fmt.Println("int16 :", math.MinInt16, "sampai", math.MaxInt16)
fmt.Println("uint16 : 0 sampai", math.MaxUint16)
fmt.Println("int32 :", math.MinInt32, "sampai", math.MaxInt32)
fmt.Println("uint32 : 0 sampai", math.MaxUint32)
fmt.Println("int64 :", math.MinInt64, "sampai", math.MaxInt64)
fmt.Println("float64 :", math.MaxFloat64)
}Output yang Dihasilkan:
bool : false
string : ""
int : 0
float64 : 0
*int : (*int)(nil)
[]int : []int(nil)
map : map[string]int(nil)
func : (func())(nil)
chan : (chan int)(nil)
struct : struct { Nama string; Umur int }{Nama:"", Umur:0}
int8 : -128 sampai 127
uint8 : 0 sampai 255
int16 : -32768 sampai 32767
uint16 : 0 sampai 65535
int32 : -2147483648 sampai 2147483647
uint32 : 0 sampai 4294967295
int64 : -9223372036854775808 sampai 9223372036854775807
float64 : 1.7976931348623157e+308Mari kita telaah bagian-bagian penting program di atas:
- Baris 9-23 (blok
var): sepuluh variabel dideklarasikan tanpa nilai awal dalam satu grup; compiler mengisi masing-masing dengan zero value tipenya. - Baris 24-27 (verb
%vdan%q): verb%qmencetak string dengan tanda kutip sehingga string kosong terlihat jelas sebagai"". - Baris 28-33 (verb
%#v): representasi sintaks Go menunjukkan bentuk nil secara eksplisit —(*int)(nil),[]int(nil), hingga(chan int)(nil). - Baris 34-41 (konstanta
math):math.MinInt8dan kawan-kawannya mencetak rentang resmi tiap tipe; hasilnya cocok dengan tabel bilangan bulat di atas.
Referensi #
- Spesifikasi Go — Numeric types — definisi resmi rentang setiap tipe numerik.
- Spesifikasi Go — Predeclared identifiers
— lokasi resmi
byte,rune,error,any, dancomparable.
Setelah mengenal seluruh tipe, langkah berikutnya adalah mengoperasikannya: operator beserta urutan prioritas evaluasinya dirangkum pada chapter Operator .
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
zero-value-demo.go
Unduh berkaspackage main
import (
"fmt"
"math"
)
func main() {
var (
aktif bool
nama string
jumlah int
rasio float64
ptr *int
daftar []int
indeks map[string]int
fungsi func()
saluran chan int
pengguna struct {
Nama string
Umur int
}
)
fmt.Printf("bool : %v\n", aktif)
fmt.Printf("string : %q\n", nama)
fmt.Printf("int : %v\n", jumlah)
fmt.Printf("float64 : %v\n", rasio)
fmt.Printf("*int : %#v\n", ptr)
fmt.Printf("[]int : %#v\n", daftar)
fmt.Printf("map : %#v\n", indeks)
fmt.Printf("func : %#v\n", fungsi)
fmt.Printf("chan : %#v\n", saluran)
fmt.Printf("struct : %#v\n", pengguna)
fmt.Println("int8 :", math.MinInt8, "sampai", math.MaxInt8)
fmt.Println("uint8 : 0 sampai", math.MaxUint8)
fmt.Println("int16 :", math.MinInt16, "sampai", math.MaxInt16)
fmt.Println("uint16 : 0 sampai", math.MaxUint16)
fmt.Println("int32 :", math.MinInt32, "sampai", math.MaxInt32)
fmt.Println("uint32 : 0 sampai", math.MaxUint32)
fmt.Println("int64 :", math.MinInt64, "sampai", math.MaxInt64)
fmt.Println("float64 :", math.MaxFloat64)
}