Golang Dasar: Dari Nol hingga CLI Production-Ready2/10

Bab 2 dari 10

Variabel, Konstanta, Tipe, String, dan Rune

Tujuan Pembelajaran

Setelah bab ini, Anda mampu:

  • mendeklarasikan variabel dan konstanta secara idiomatis;
  • memahami tipe statis, nilai nol, konversi, dan inferensi;
  • memilih tipe numerik yang tepat;
  • mengolah teks UTF-8 dengan string, byte, dan rune.

1. Variabel dan Nilai Nol

Go bertipe statis: tipe setiap nilai diketahui saat kompilasi. Deklarasi var dapat menyertakan tipe, nilai awal, atau keduanya.

Code
package main

import "fmt"

func main() {
	var jumlah int
	var aktif bool
	var nama = "Nadia"
	usia := 21

	fmt.Println(jumlah, aktif, nama, usia)
}

Variabel tanpa initializer memperoleh zero value: 0 untuk angka, false untuk boolean, "" untuk string, dan nil untuk pointer, slice, map, channel, fungsi, serta interface.

:= adalah deklarasi singkat dan hanya berlaku di dalam fungsi. Gunakan var untuk variabel tingkat package atau ketika tipe/nilai nol perlu ditonjolkan.

Deklarasi singkat multivariabel boleh mendeklarasikan sebagian nama baru:

Code
x, y := 10, 20
x, z := 30, 40
fmt.Println(x, y, z)

Baris kedua sah karena z baru; x hanya diberi nilai baru.

2. Konstanta dan Tipe Dasar

Konstanta ditentukan saat kompilasi dan tidak dapat diubah. Konstanta dapat tidak bertipe sampai konteks menuntut tipe tertentu.

Code
package main

import "fmt"

const Pi = 3.141592653589793
const MaksPercobaan int = 3

func main() {
	var radius float64 = 2
	luas := Pi * radius * radius
	fmt.Println(luas, MaksPercobaan)
}

Tipe dasar penting:

  • bool;
  • string;
  • integer bertanda int, int8, int16, int32, int64;
  • integer tanpa tanda uint, uint8, uint16, uint32, uint64;
  • pecahan float32, float64;
  • kompleks complex64, complex128;
  • alias byte untuk uint8 dan rune untuk int32.

Gunakan int untuk hitungan umum dan indeks. Gunakan ukuran eksplisit untuk format data/protokol. Pilih float64 sebagai default pecahan, tetapi jangan memakainya untuk uang jika pembulatan desimal harus eksak; simpan satuan terkecil sebagai integer.

3. Konversi Eksplisit

Go tidak melakukan konversi numerik implisit.

Code
package main

import "fmt"

func main() {
	jumlah := 7
	rata := float64(jumlah) / 2
	fmt.Println(rata)
}

Konversi dapat kehilangan informasi: int(3.9) menjadi 3, dan konversi ke integer sempit dapat meluap sesuai representasi. Validasi rentang di batas input sebelum mengonversi.

4. String, Byte, Rune, dan UTF-8

string adalah urutan byte yang immutable. Teks Go lazimnya UTF-8, tetapi sebuah string secara teknis dapat memuat byte apa pun. len(s) menghitung byte, bukan karakter pengguna.

Memuat diagram…

Contoh yang memperlihatkan perbedaannya:

Code
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	s := "Go語"
	fmt.Println(len(s))
	fmt.Println(utf8.RuneCountInString(s))

	for indeksByte, r := range s {
		fmt.Printf("indeks=%d rune=%q kode=%U\n", indeksByte, r, r)
	}
}

memerlukan tiga byte UTF-8. range mendekode rune dan memberikan indeks byte awal setiap rune. Rune mewakili code point Unicode, bukan selalu satu karakter yang terlihat; grafem seperti emoji keluarga dapat terdiri dari beberapa rune.

Indeks langsung menghasilkan byte:

Code
package main

import "fmt"

func main() {
	s := "é"
	fmt.Printf("%x\n", s[0])
	r := []rune(s)
	fmt.Printf("%c\n", r[0])
}

Konversi []byte(s) cocok untuk data mentah/UTF-8; []rune(s) cocok ketika operasi memang berbasis code point. Keduanya mengalokasikan salinan yang dapat diubah.

String literal berinterpretasi memakai tanda petik dan escape seperti \n. Raw string memakai backtick dan mempertahankan baris serta backslash:

Code
package main

import "fmt"

func main() {
	path := `C:\data\laporan.txt`
	baris := "pertama\nkedua"
	fmt.Println(path)
	fmt.Println(baris)
}

Kesalahan Umum

  • Memakai := di tingkat package. Gunakan var atau const.
  • Mencampur tipe angka tanpa konversi. Konversikan secara eksplisit dan periksa potensi kehilangan data.
  • Menganggap len(string) menghitung huruf. len menghitung byte.
  • Mengambil s[i] dan berharap rune. Hasilnya byte; gunakan range atau []rune bila perlu.
  • Menganggap rune sama dengan grafem visual. Rune adalah code point, bukan seluruh karakter gabungan.
  • Membuat variabel yang tidak digunakan. Go menolak variabel lokal dan import yang tidak dipakai.
  • Melakukan shadowing tanpa sadar. x := dalam blok dalam dapat membuat variabel baru, bukan memperbarui variabel luar.

Latihan

  1. Deklarasikan profil pengguna memakai string, int, dan bool; cetak zero value sebelum pemberian nilai.
  2. Hitung luas lingkaran dengan konstanta tak bertipe dan float64.
  3. Untuk string "Indonesia 🇮🇩", tampilkan jumlah byte, jumlah rune, indeks byte, dan setiap rune.
  4. Buat program yang menerima jumlah detik sebagai int dan menghitung jam, menit, serta detik.
  5. Tunjukkan satu konversi numerik yang kehilangan pecahan, lalu jelaskan hasilnya.

Rangkuman

Deklarasi Go menyeimbangkan kejelasan var dengan ringkasnya :=. Konstanta dapat tetap tidak bertipe hingga digunakan, sedangkan konversi antarangka selalu eksplisit. String menyimpan byte; rune merepresentasikan code point Unicode. Pilih operasi byte, rune, atau grafem sesuai kebutuhan, jangan berdasarkan asumsi bahwa semuanya setara dengan “karakter”.