Variabel adalah nama untuk menyimpan sebuah nilai, dan di Go tiap variabel punya tipe yang tetap: angka bulat, angka desimal, teks, atau benar/salah. Bayangin kotak-kotak di etalase Warung Bakso Mas Bimo. Tiap kotak diberi label nama dan label isi: kotak porsi khusus angka bulat, kotak menu khusus teks. Kotak angka gak bisa diisi teks, dan isinya gak pernah berubah jenis diam-diam. Itu yang disebut statically typed: tipe dicek compiler sebelum program jalan.
🧪 Tebakan cepat:
porsi := 3danharga := 15000.0. Kalau kamu menulisfmt.Println(porsi * harga), apa yang terjadi: tercetak45000, atau compile gagal? Tebak dulu, jawabannya ada di bagian "Konversi harus ditulis sendiri".
Dua cara bikin variabel: var dan :=
package main
import "fmt"
var warung = "Warung Bakso Mas Bimo" // level package: wajib var
func main() {
var menu string = "Bakso urat" // var, nama, tipe, nilai
porsi := 3 // := menebak tipenya: int
harga := 15000.0 // ada .0, jadi float64
lunas := true // bool
porsi = 4 // ganti nilai: cukup =
fmt.Println(warung, menu, porsi, harga, lunas)
}
$ go run bakso.go
Warung Bakso Mas Bimo Bakso urat 4 15000 true
var menu string = "Bakso urat"adalah bentuk panjang: katavar, nama, tipe, lalu nilai. Tipenya boleh dihapus kalau ada nilainya:var warung = "...".porsi := 3adalah bentuk pendek (short declaration). Tipenya ditebak compiler dari nilainya:3jadiint,15000.0jadifloat64.:=cuma boleh di dalam fungsi. Di luar fungsi (level package, dipakai semua fungsi di file itu) wajib pakaivar. Kalauwarung := "..."ditulis di luar fungsi, compile gagal dengansyntax error: non-declaration statement outside function body.:=membuat variabel baru,=mengganti isi variabel yang sudah ada. Menulisporsi := 4lagi gagal denganno new variables on left side of :=.
Empat tipe dasar
| Tipe | Contoh | Isinya |
|---|---|---|
int |
3, 15000, -2 |
angka bulat |
float64 |
15000.0, 0.1 |
angka desimal |
string |
"Bakso urat" |
teks, selalu kutip ganda |
bool |
true, false |
benar atau salah |
Uang rupiah paling aman disimpan sebagai int, karena angka desimal bisa punya selisih pembulatan kecil. Isi variabel yang tipenya beda ditolak: var porsi int = "tiga" gagal dengan cannot use "tiga" (untyped string constant) as int value in variable declaration.
Zero value: gak pernah kosong
Variabel yang dibuat dengan var tanpa nilai langsung diisi zero value, nilai nol untuk tipenya. Di Go gak ada variabel yang isinya undefined.
var porsi int // 0
var harga float64 // 0
var menu string // "" (teks kosong)
var lunas bool // false
fmt.Println(porsi, harga, menu, lunas)
0 0 false
Ada dua spasi di tengah output itu: menu adalah teks kosong, jadi di antara 0 dan false cuma ada spasi pemisahnya.
Konversi harus ditulis sendiri
Go gak pernah mengubah tipe diam-diam. int dikali float64 ditolak:
package main
import "fmt"
func main() {
porsi := 3
harga := 15000.0
fmt.Println(porsi * harga)
}
$ go run bakso.go
# command-line-arguments
./bakso.go:8:14: invalid operation: porsi * harga (mismatched types int and float64)
Itu jawaban tebakannya: compile gagal, gak ada yang tercetak. Ubah tipenya sendiri dengan menulis nama tipe seperti fungsi: float64(porsi) * harga hasilnya 45000. Arah sebaliknya, int(x) dengan x := 15999.9, membuang pecahannya jadi 15999, bukan dibulatkan.
Mencetak dengan fmt.Printf
fmt.Printf mencetak teks dengan pola. Tiap verb (kata format yang diawali %) diganti nilai berikutnya, berurutan:
menu := "Bakso urat"
porsi := 3
harga := 15000.0
fmt.Printf("%s: %d porsi\n", menu, porsi)
fmt.Printf("%q %v %.2f %T\n", menu, porsi, harga, harga)
Bakso urat: 3 porsi
"Bakso urat" 3 15000.00 float64
%suntuk teks,%duntuk angka bulat,%vuntuk nilai apa pun dalam bentuk biasanya.%qmencetak teks lengkap dengan kutipnya,%.2fmencetak desimal dengan 2 angka di belakang koma,%Tmencetak tipenya.%+vsama dengan%vuntuk angka dan teks. Bedanya baru kelihatan di struct nanti: nama field-nya ikut dicetak.\nadalah pindah baris.Printfgak pindah baris sendiri, beda denganPrintln.
⚠️ Jebakan yang sering ketemu
- Lupa
\ndiPrintf.fmt.Printf("Halo, %s!", nama)lalufmt.Println("Selesai")keluar satu baris:Halo, Budi!Selesai. - Verb gak cocok dengan nilainya.
%ddiberi teks gak bikin compile gagal, tapi hasilnya aneh:%!d(string=Budi). Urutan nilainya harus sama dengan urutan verb-nya. 15000tanpa.0.harga := 15000jadiint, bukanfloat64. Tulis15000.0atauvar harga float64 = 15000.- Variabel yang gak dipakai. Seperti di pelajaran sebelumnya,
declared and not usedbikin compile gagal.
TL;DR: Variabel Go punya tipe tetap. var nama tipe = nilai bisa di mana saja, nama := nilai cuma di dalam fungsi dan tipenya ditebak dari nilainya. := membuat variabel baru, = mengganti isinya. Empat tipe dasar: int, float64, string, bool. Variabel tanpa nilai dapat zero value: 0, 0, "", false. Tipe gak pernah berubah diam-diam: int dikali float64 itu error, tulis float64(porsi). fmt.Printf mengisi verb berurutan: %s teks, %d angka bulat, %v apa saja, %q teks berkutip, %.2f dua desimal, %T tipe, dan \n untuk pindah baris.