BAB 8: Konstanta - Abd. Asis

BAB 8: Konstanta

Setelah mempelajari variable dan data types, sekarang kita akan belajar tentang konstanta. Konstanta adalah nilai yang tidak berubah sepanjang program berjalan. Berbeda dengan variable yang nilainya bisa diubah-ubah, konstanta nilainya tetap dari awal sampai akhir program.

Apa itu Konstanta?

Konstanta adalah jenis variable yang nilainya tidak bisa diubah setelah dideklarasikan. Bayangkan konstanta seperti nama kamu - sekali ditentukan, ya tetap begitu. Konstanta sangat berguna untuk menyimpan nilai-nilai yang memang tidak akan berubah, seperti nilai pi (3.14159), kecepatan cahaya, atau konfigurasi aplikasi.

Perbedaan utama konstanta dengan variable:

  • Variable: nilainya bisa berubah (var)
  • Konstanta: nilainya tetap selamanya (const)

Deklarasi Konstanta Dasar

Cara mendeklarasikan konstanta sama seperti variable, tapi menggunakan keyword const:

package main

import "fmt"

func main() {
    const firstName string = "John"
    const pi float64 = 3.14159
    const isActive bool = true
    
    fmt.Println("Nama:", firstName)
    fmt.Println("Pi:", pi)
    fmt.Println("Status:", isActive)
}

Type Inference pada Konstanta

Sama seperti variable, konstanta juga mendukung type inference - Go bisa menebak type data berdasarkan nilai yang diberikan:

package main

import "fmt"

func main() {
    const lastName = "Wick"           // string
    const gravity = 9.81              // float64
    const maxUsers = 100              // int
    const isReady = true              // bool
    
    fmt.Printf("lastName: %s (type: %T)\n", lastName, lastName)
    fmt.Printf("gravity: %.2f (type: %T)\n", gravity, gravity)
    fmt.Printf("maxUsers: %d (type: %T)\n", maxUsers, maxUsers)
    fmt.Printf("isReady: %t (type: %T)\n", isReady, isReady)
}

Deklarasi Multiple Konstanta

Konstanta dalam Satu Baris

package main

import "fmt"

func main() {
    const satu, dua = 1, 2
    const three, four string = "tiga", "empat"
    
    fmt.Println("satu:", satu, "dua:", dua)
    fmt.Println("three:", three, "four:", four)
}

Grouped Constants

Untuk organisasi yang lebih baik, kita bisa mengelompokkan konstanta menggunakan kurung:

package main

import "fmt"

func main() {
    const (
        square     = "kotak"
        isToday    bool = true
        numeric    uint8 = 1
        floatNum   = 2.2
    )
    
    fmt.Println("Shape:", square)
    fmt.Println("Today:", isToday)
    fmt.Println("Number:", numeric)
    fmt.Println("Float:", floatNum)
}

Konstanta dengan Nilai yang Sama

Ketika kita tidak menuliskan nilai dalam deklarasi konstanta, Go akan menggunakan nilai yang sama dengan konstanta di atasnya:

package main

import "fmt"

func main() {
    const (
        a = "konstanta"
        b                    // b akan sama dengan a: "konstanta"
        c = "berbeda"
        d                    // d akan sama dengan c: "berbeda"
    )
    
    fmt.Println("a:", a)     // konstanta
    fmt.Println("b:", b)     // konstanta
    fmt.Println("c:", c)     // berbeda
    fmt.Println("d:", d)     // berbeda
}

Kombinasi Berbagai Deklarasi

package main

import "fmt"

func main() {
    const (
        today string = "senin"
        sekarang               // "senin" (sama dengan today)
        isToday2 = true        // type inference untuk bool
        tomorrow               // true (sama dengan isToday2)
    )
    
    fmt.Println("today:", today)
    fmt.Println("sekarang:", sekarang)
    fmt.Println("isToday2:", isToday2)
    fmt.Println("tomorrow:", tomorrow)
}

Konstanta untuk Konfigurasi Aplikasi

Konstanta sangat berguna untuk menyimpan konfigurasi aplikasi:

package main

import "fmt"

const (
    AppName    = "My Go App"
    Version    = "1.0.0"
    MaxUsers   = 1000
    TimeoutSec = 30
    DebugMode  = true
)

func main() {
    fmt.Printf("Starting %s v%s\n", AppName, Version)
    fmt.Printf("Max users: %d\n", MaxUsers)
    fmt.Printf("Timeout: %d seconds\n", TimeoutSec)
    fmt.Printf("Debug mode: %t\n", DebugMode)
}

Konstanta Matematika

package main

import "fmt"

const (
    Pi         = 3.14159265359
    E          = 2.71828182846
    GoldenRatio = 1.61803398875
    SqrtTwo    = 1.41421356237
)

func calculateCircleArea(radius float64) float64 {
    return Pi * radius * radius
}

func main() {
    radius := 5.0
    area := calculateCircleArea(radius)
    
    fmt.Printf("Circle area with radius %.1f: %.2f\n", radius, area)
    fmt.Printf("Pi: %.5f\n", Pi)
    fmt.Printf("Euler's number: %.5f\n", E)
}

Konstanta String untuk Enum-like Values

Meskipun Go tidak memiliki enum seperti bahasa lain, kita bisa menggunakan konstanta string untuk hal serupa:

package main

import "fmt"

const (
    StatusPending   = "pending"
    StatusApproved  = "approved"
    StatusRejected  = "rejected"
    StatusCompleted = "completed"
)

func processOrder(status string) {
    switch status {
    case StatusPending:
        fmt.Println("Order is waiting for approval")
    case StatusApproved:
        fmt.Println("Order has been approved")
    case StatusRejected:
        fmt.Println("Order has been rejected")
    case StatusCompleted:
        fmt.Println("Order has been completed")
    default:
        fmt.Println("Unknown status")
    }
}

func main() {
    processOrder(StatusPending)
    processOrder(StatusApproved)
    processOrder("invalid")
}

Konstanta vs Variable

Mari lihat perbedaan praktis antara konstanta dan variable:

package main

import "fmt"

func main() {
    // Variable - bisa diubah
    var name string = "John"
    fmt.Println("Original name:", name)
    
    name = "Jane"  // OK - variable bisa diubah
    fmt.Println("Updated name:", name)
    
    // Konstanta - tidak bisa diubah
    const companyName = "Tech Corp"
    fmt.Println("Company:", companyName)
    
    // companyName = "New Corp"  // ERROR! Konstanta tidak bisa diubah
    
    // Konstanta harus diinisialisasi saat deklarasi
    // const uninitialized  // ERROR! Konstanta harus ada nilainya
}

Scope Konstanta

Konstanta mengikuti aturan scope yang sama dengan variable:

package main

import "fmt"

// Global constants
const (
    GlobalAppName = "My App"
    GlobalVersion = "1.0"
)

func processData() {
    // Local constants
    const (
        ProcessTimeout = 30
        MaxRetries     = 3
    )
    
    fmt.Printf("Processing with timeout: %d seconds\n", ProcessTimeout)
    fmt.Printf("Max retries: %d\n", MaxRetries)
    fmt.Printf("App: %s v%s\n", GlobalAppName, GlobalVersion)
}

func main() {
    processData()
    
    // Konstanta dalam block
    if true {
        const localMessage = "Hello from block"
        fmt.Println(localMessage)
    }
    
    // fmt.Println(localMessage)  // ERROR! localMessage tidak ada di scope ini
}

Konstanta untuk HTTP Status Codes

Contoh praktis penggunaan konstanta untuk HTTP status codes:

package main

import "fmt"

const (
    StatusOK                   = 200
    StatusBadRequest          = 400
    StatusUnauthorized        = 401
    StatusForbidden           = 403
    StatusNotFound            = 404
    StatusInternalServerError = 500
)

func handleResponse(statusCode int) {
    switch statusCode {
    case StatusOK:
        fmt.Println("Request successful")
    case StatusBadRequest:
        fmt.Println("Bad request")
    case StatusUnauthorized:
        fmt.Println("Authentication required")
    case StatusNotFound:
        fmt.Println("Resource not found")
    case StatusInternalServerError:
        fmt.Println("Server error")
    default:
        fmt.Printf("Status code: %d\n", statusCode)
    }
}

func main() {
    handleResponse(StatusOK)
    handleResponse(StatusNotFound)
    handleResponse(StatusInternalServerError)
}

Konstanta untuk Database Configuration

package main

import "fmt"

const (
    // Database constants
    DBHost     = "localhost"
    DBPort     = 5432
    DBName     = "myapp_db"
    DBUser     = "admin"
    DBPassword = "secret123"
    
    // Connection pool constants
    MaxOpenConns    = 25
    MaxIdleConns    = 25
    ConnMaxLifetime = 300 // seconds
)

func createConnectionString() string {
    return fmt.Sprintf("host=%s port=%d dbname=%s user=%s password=%s",
        DBHost, DBPort, DBName, DBUser, DBPassword)
}

func main() {
    connStr := createConnectionString()
    fmt.Println("Connection string:", connStr)
    fmt.Printf("Max connections: %d\n", MaxOpenConns)
    fmt.Printf("Max idle connections: %d\n", MaxIdleConns)
}

Konstanta dalam Package Level

Konstanta juga bisa dideklarasikan di level package (di luar function):

package main

import "fmt"

// Package level constants
const (
    AppTitle       = "My Golang Application"
    DefaultTimeout = 30
    MaxFileSize    = 1024 * 1024 * 10 // 10MB
)

func uploadFile(size int) {
    if size > MaxFileSize {
        fmt.Printf("File too large. Max size: %d bytes\n", MaxFileSize)
        return
    }
    fmt.Printf("Uploading file of size: %d bytes\n", size)
}

func main() {
    fmt.Printf("Welcome to %s\n", AppTitle)
    fmt.Printf("Default timeout: %d seconds\n", DefaultTimeout)
    
    uploadFile(1024)           // OK
    uploadFile(MaxFileSize + 1) // Too large
}

Best Practices

1. Gunakan Nama yang Deskriptif

// BAIK
const (
    MaxRetryAttempts = 3
    ConnectionTimeout = 30
    DefaultPageSize = 20
)

// KURANG BAIK
const (
    M = 3
    T = 30
    P = 20
)

2. Kelompokkan Konstanta yang Berkaitan

// BAIK: kelompokkan berdasarkan kategori
const (
    // HTTP Status Codes
    StatusOK = 200
    StatusNotFound = 404
    StatusError = 500
)

const (
    // Database Configuration
    DBTimeout = 30
    DBMaxConns = 10
    DBRetries = 3
)

// KURANG BAIK: semua dicampur
const (
    StatusOK = 200
    DBTimeout = 30
    StatusNotFound = 404
    DBMaxConns = 10
)

3. Gunakan Konstanta untuk Magic Numbers

// BAIK: gunakan konstanta
const (
    DaysInWeek = 7
    HoursInDay = 24
    MinutesInHour = 60
)

func calculateWeeklyHours(dailyHours int) int {
    return dailyHours * DaysInWeek
}

// KURANG BAIK: magic numbers
func calculateWeeklyHours(dailyHours int) int {
    return dailyHours * 7  // 7 itu apa?
}

4. Gunakan Type yang Tepat

// BAIK: type yang sesuai
const (
    ServerPort    uint16  = 8080    // port number
    MaxUsers      int     = 1000    // jumlah user
    TimeoutSec    float64 = 30.5    // timeout dalam detik
    IsProduction  bool    = false   // flag environment
)

Latihan

Latihan 1: Konstanta Dasar

package main

import "fmt"

func main() {
    // TODO: Buat konstanta untuk:
    // - nama lengkap kamu (string)
    // - umur kamu (int) 
    // - tinggi badan dalam meter (float64)
    // - status pelajar (bool)
    
    // Tampilkan semua konstanta dengan format yang rapi
}

Latihan 2: Konstanta Matematika

package main

import "fmt"

// TODO: Buat konstanta untuk:
// - Pi (3.14159)
// - Gravitasi bumi (9.81 m/s²)
// - Kecepatan cahaya (299792458 m/s)

// TODO: Buat function untuk menghitung:
// - Luas lingkaran berdasarkan radius
// - Kecepatan jatuh bebas berdasarkan waktu
// - Jarak yang ditempuh cahaya dalam waktu tertentu

func main() {
    // Test semua function yang sudah dibuat
}

Latihan 3: Konstanta untuk Status

package main

import "fmt"

// TODO: Buat konstanta untuk status order:
// - "draft", "submitted", "processing", "shipped", "delivered", "cancelled"

// TODO: Buat function processOrder(status string) yang:
// - Menerima status sebagai parameter
// - Menampilkan pesan sesuai status
// - Menggunakan switch case

func main() {
    // TODO: Test function dengan berbagai status
}

Latihan 4: Konfigurasi Aplikasi

package main

import "fmt"

// TODO: Buat konstanta untuk konfigurasi web server:
// - Server host (localhost)
// - Server port (8080)
// - Max connections (100)
// - Request timeout (30 detik)
// - Static files directory ("/static")

// TODO: Buat function startServer() yang menampilkan info server
// TODO: Buat function isValidConnection(current int) yang cek apakah 
//       jumlah koneksi saat ini melebihi batas maksimal

func main() {
    // Test semua function
}

Kesimpulan

Konstanta adalah fitur penting di Go untuk menyimpan nilai yang tidak berubah. Poin-poin penting yang perlu diingat:

  • Gunakan const untuk mendeklarasikan konstanta
  • Konstanta harus diinisialisasi saat deklarasi
  • Nilai konstanta tidak bisa diubah setelah dideklarasikan
  • Konstanta mendukung type inference
  • Bisa mendeklarasikan multiple konstanta sekaligus
  • Konstanta tanpa nilai akan mengikuti nilai konstanta di atasnya
  • Gunakan konstanta untuk magic numbers, konfigurasi, dan nilai tetap
  • Kelompokkan konstanta yang berkaitan untuk organisasi yang lebih baik

Dengan memahami konstanta, kamu bisa membuat kode yang lebih aman dan mudah dipelihara. Nilai-nilai yang memang tidak akan berubah sebaiknya dideklarasikan sebagai konstanta untuk mencegah kesalahan dan membuat kode lebih readable. Di bab selanjutnya, kita akan belajar tentang operator untuk memanipulasi data.