Chapter 2 of 10
Setelah bab ini, Anda mampu:
string, byte, dan rune.Go bertipe statis: tipe setiap nilai diketahui saat kompilasi. Deklarasi var dapat menyertakan tipe, nilai awal, atau keduanya.
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:
x, y := 10, 20
x, z := 30, 40
fmt.Println(x, y, z)
Baris kedua sah karena z baru; x hanya diberi nilai baru.
Konstanta ditentukan saat kompilasi dan tidak dapat diubah. Konstanta dapat tidak bertipe sampai konteks menuntut tipe tertentu.
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;int, int8, int16, int32, int64;uint, uint8, uint16, uint32, uint64;float32, float64;complex64, complex128;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.
Go tidak melakukan konversi numerik implisit.
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.
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.
Contoh yang memperlihatkan perbedaannya:
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:
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:
package main
import "fmt"
func main() {
path := `C:\data\laporan.txt`
baris := "pertama\nkedua"
fmt.Println(path)
fmt.Println(baris)
}
:= di tingkat package. Gunakan var atau const.len(string) menghitung huruf. len menghitung byte.s[i] dan berharap rune. Hasilnya byte; gunakan range atau []rune bila perlu.x := dalam blok dalam dapat membuat variabel baru, bukan memperbarui variabel luar.string, int, dan bool; cetak zero value sebelum pemberian nilai.float64."Indonesia 🇮🇩", tampilkan jumlah byte, jumlah rune, indeks byte, dan setiap rune.int dan menghitung jam, menit, serta detik.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”.