BAB 6: Variabel — Menyimpan dan Mengelola Data

Pelajari cara menyimpan dan mengelola data menggunakan variabel di Go — dari deklarasi var, shorthand :=, zero value, hingga scope dan blank identifier.

Semua program yang kamu tulis sejauh ini bekerja dengan nilai yang langsung tertanam di kode — "Hello, Go!", angka literal, teks tetap. Begitu program selesai dijalankan, tidak ada yang tersisa. Untuk membuat program yang benar-benar berguna, kamu butuh cara menyimpan data, mengubahnya, dan meneruskannya dari satu bagian program ke bagian lain. Itulah peran variabel.

Di Go, variabel bukan sekadar wadah — setiap variabel punya tipe yang ditentukan di awal dan tidak bisa berubah. Ini berbeda dari JavaScript atau Python yang lebih fleksibel, tapi justru inilah yang membuat program Go lebih mudah diprediksi dan lebih jarang mengandung bug tersembunyi.

Dua Cara Mendeklarasikan Variabel

Go memberikan dua sintaks untuk mendeklarasikan variabel, masing-masing dengan konteks penggunaan yang berbeda.

Keyword var

var adalah cara paling eksplisit. Kamu menyebutkan nama variabel dan tipenya secara tertulis:

// main.go
package main

import "fmt"

func main() {
    var nama string = "Gopher"
    var umur int = 3
    var tinggi float64 = 165.5
    var aktif bool = true

    fmt.Println(nama, umur, tinggi, aktif)
}

Jika nilai awal sudah diberikan, tipe boleh dihilangkan — Go akan menyimpulkannya sendiri:

var nama = "Gopher"   // Go tahu ini string
var umur = 3          // Go tahu ini int

var juga bisa digunakan di luar function, di level package. Ini yang membedakannya dari :=.

Short variable declaration :=

Di dalam function, ada sintaks yang lebih ringkas:

// main.go
package main

import "fmt"

func main() {
    nama := "Gopher"
    umur := 3
    tinggi := 165.5

    fmt.Println(nama, umur, tinggi)
}

:= mendeklarasikan sekaligus menginisialisasi variabel. Go menyimpulkan tipenya dari nilai yang diberikan. Ini yang paling sering kamu lihat dalam kode Go sehari-hari.

:= hanya bisa digunakan di dalam function. Mencoba memakainya di level package akan menghasilkan compile error: syntax error: non-declaration statement outside function body.

Deklarasi Grup

Ketika mendeklarasikan beberapa variabel sekaligus — terutama di level package — sintaks grup lebih rapi:

// main.go
package main

import "fmt"

var (
    serverHost = "localhost"
    serverPort = 8080
    serverSSL  = false
)

func main() {
    fmt.Println(serverHost, serverPort, serverSSL)
}

Di dalam function, multiple assignment dengan := juga bisa dilakukan dalam satu baris:

nama, umur, aktif := "Gopher", 3, true

Zero Value

Salah satu keputusan desain Go yang menarik: setiap variabel yang dideklarasikan tanpa nilai awal otomatis mendapat zero value sesuai tipenya. Tidak ada variabel yang “tidak diinisialisasi” di Go.

// main.go
package main

import "fmt"

func main() {
    var angka int
    var teks string
    var aktif bool
    var desimal float64

    fmt.Printf("int: %d\n", angka)       // int: 0
    fmt.Printf("string: %q\n", teks)     // string: ""
    fmt.Printf("bool: %t\n", aktif)      // bool: false
    fmt.Printf("float64: %f\n", desimal) // float64: 0.000000
}

Zero value untuk setiap tipe dasar:

TipeZero value
int, int64, dll0
float32, float640.0
string""
boolfalse
pointer, slice, map, channelnil

Ini berguna saat kamu mendeklarasikan variabel yang nilainya akan diisi nanti berdasarkan kondisi tertentu.

Mengubah Nilai Variabel

Setelah dideklarasikan, nilai variabel bisa diubah dengan assignment biasa menggunakan =:

// main.go
package main

import "fmt"

func main() {
    skor := 0

    // simulasi penambahan skor
    skor = 10
    fmt.Println("Skor setelah level 1:", skor)

    skor = skor + 25
    fmt.Println("Skor setelah level 2:", skor)
}

Go juga mendukung multiple assignment dalam satu baris, yang sangat berguna untuk menukar nilai dua variabel:

a, b := 10, 20
a, b = b, a // tukar nilai tanpa variabel sementara
fmt.Println(a, b) // 20 10

Scope Variabel

Scope menentukan di bagian mana sebuah variabel bisa diakses. Di Go, scope mengikuti blok kode yang ditandai kurung kurawal { }.

Variabel yang dideklarasikan di level package bisa diakses dari semua function dalam package yang sama. Variabel yang dideklarasikan di dalam function hanya bisa diakses di dalam function itu. Variabel di dalam blok if, for, atau blok lain hanya bisa diakses di dalam blok tersebut.

// main.go
package main

import "fmt"

var appName = "KalkulatorGo" // bisa diakses di seluruh package

func main() {
    versi := "1.0" // hanya bisa diakses di dalam main()

    if true {
        pesan := "Siap digunakan" // hanya bisa diakses di dalam blok if ini
        fmt.Println(appName, versi, pesan)
    }

    // fmt.Println(pesan) // compile error: undefined: pesan
    fmt.Println(appName, versi)
}

Deklarasikan variabel sedekat mungkin dengan tempat pertama kali digunakan. Ini membuat kode lebih mudah dibaca karena pembaca tidak perlu scroll ke atas untuk mencari tahu apa isi variabel tersebut.

Blank Identifier

Beberapa function di Go mengembalikan lebih dari satu nilai. Jika kamu hanya butuh sebagian, gunakan _ (blank identifier) untuk mengabaikan nilai yang tidak diperlukan:

// main.go
package main

import "fmt"

func infoUser() (string, int) {
    return "Gopher", 3
}

func main() {
    // hanya butuh nama, abaikan umur
    nama, _ := infoUser()
    fmt.Println(nama)

    // hanya butuh umur, abaikan nama
    _, umur := infoUser()
    fmt.Println(umur)
}

_ bukan variabel sungguhan — nilainya langsung dibuang. Go tidak akan mengeluh soal “variabel tidak digunakan” untuk _.

var vs := — Kapan Pakai yang Mana

Dalam praktik sehari-hari, pilihan antara var dan := cukup sederhana:

Gunakan := untuk variabel lokal di dalam function — lebih singkat dan lebih idiomatis di Go. Gunakan var ketika mendeklarasikan di level package, atau ketika kamu sengaja ingin variabel dimulai dengan zero value tanpa memberikan nilai awal:

var hasil int // sengaja dimulai dari 0, akan diisi nanti

Gunakan var juga ketika tipe perlu dinyatakan secara eksplisit karena nilainya ambigu:

var angka float64 = 10 // tanpa ini, Go akan menyimpulkan int

Latihan

  1. Buat program yang mendeklarasikan empat variabel: nama (string), umur (int), tinggi (float64), dan aktif (bool). Isi dengan data kamu sendiri menggunakan :=, lalu cetak semuanya dengan fmt.Printf menggunakan format specifier yang tepat.

  2. Deklarasikan dua variabel a dan b dengan nilai berbeda, lalu tukar nilainya menggunakan multiple assignment. Cetak nilai sebelum dan sesudah penukaran.

  3. Deklarasikan variabel counter bertipe int tanpa nilai awal. Cetak zero value-nya, lalu tambahkan nilai ke dalamnya tiga kali dalam tiga baris terpisah. Cetak hasilnya setiap kali.

Variabel menyimpan data, tapi selama ini kita belum benar-benar memperhatikan jenis data yang disimpan. Kenapa 10 dan 10.5 diperlakukan berbeda? Kenapa tidak semua angka bisa saling dijumlahkan langsung? Jawabannya ada di tipe data — dan itu yang akan kita bahas di bab berikutnya.

Referensi

  1. 1Variables — A Tour of Go
  2. 2Short Variable Declarations — Go Specification
  3. 3The Zero Value — Go Specification