String di Go
String di Go adalah immutable — sekali dibuat, isinya tidak bisa diubah. Untuk memanipulasi string, kita menggunakan package strings dan fmt.
Membuat String
nama := "Budi"
pesan := "Halo, dunia!"
// Backtick untuk raw string (tanpa escape)
path := `C:\Users\Budi`
Package strings
import "strings"
s := "Hello, World!"
strings.ToUpper(s) // "HELLO, WORLD!"
strings.ToLower(s) // "hello, world!"
strings.Contains(s, "World") // true
strings.Replace(s, "Hello", "Hi", 1) // "Hi, World!"
strings.Split("a,b,c", ",") // ["a", "b", "c"]
strings.Join([]string{"a","b"}, "-") // "a-b"
strings.TrimSpace(" hi ") // "hi"
len(s) // 13
Format String dengan fmt.Sprintf
nama := "Budi"
umur := 25
// Sprintf mengembalikan string (tidak mencetak)
pesan := fmt.Sprintf("Halo, %s! Umur: %d", nama, umur)
fmt.Println(pesan) // "Halo, Budi! Umur: 25"
String Concatenation
a := "Hello"
b := "World"
c := a + ", " + b + "!"
fmt.Println(c) // "Hello, World!"
String = Byte Slice, BUKAN Rune
Ini gotcha penting yang sering bikin developer baru kaget. String di Go secara internal adalah sequence of bytes (UTF-8), bukan sequence of characters. Fungsi len() mengembalikan jumlah byte, bukan jumlah karakter/rune.
s := "halo"
fmt.Println(len(s)) // 4 — ASCII, satu karakter = satu byte
s2 := "hålö"
fmt.Println(len(s2)) // 6 — å dan ö masing-masing 2 byte (UTF-8)
// Iterasi per byte (SALAH untuk Unicode)
for i := 0; i < len(s2); i++ {
fmt.Printf("%d ", s2[i]) // print byte mentah, bisa "setengah" karakter
}
// Iterasi per rune (BENAR untuk Unicode)
for _, r := range s2 {
fmt.Printf("%c ", r) // h å l ö
}
Rune adalah alias untuk int32 — satu code point Unicode. Jika kamu butuh menghitung karakter Unicode, konversi dulu:
fmt.Println(len([]rune(s2))) // 4 — jumlah karakter sesungguhnya
Gunakan utf8.RuneCountInString(s) dari package unicode/utf8 untuk hitung rune tanpa alokasi.