String adalah tipe untuk teks. Di Go, string adalah deretan byte, potongan data sebesar 8 bit, yang ditulis dengan aturan UTF-8, dan isinya gak bisa diubah setelah dibuat (immutable). Bayangin papan nama pesanan di Warung Bakso Mas Bimo yang disusun dari keping huruf tempel. Huruf biasa seperti A cukup satu keping. Huruf beraksen seperti é butuh dua keping, dan huruf Jepang butuh tiga. Fungsi len di Go menghitung keping, bukan huruf.
🧪 Tebakan cepat: pelanggan bernama André memesan bakso.
len("André")hasilnya 5 atau 6? Tebak dulu, jawabannya ada di bagian "Byte dan rune".
Bikin dan menyambung string
nama := "André"
pesanan := "bakso urat, es teh"
fmt.Println(nama + " pesan " + pesanan)
catatan := `C:\warung\menu.txt`
fmt.Println(catatan)
André pesan bakso urat, es teh
C:\warung\menu.txt
- Teks di antara kutip ganda
"..."boleh berisi escape sequence, kode yang diawali\:\npindah baris,\ttab,\"kutip. - Teks di antara backtick
`...`adalah raw string literal: semua karakter diambil apa adanya,\gak diproses, dan boleh lebih dari satu baris. Cocok untuk path Windows, regex, atau JSON. +menyambung dua string jadi string baru.- String gak bisa disambung dengan angka.
"Porsi: " + porsidenganporsi := 3gagal denganinvalid operation: "Porsi: " + porsi (mismatched types untyped string and int). Ubah angkanya dulu denganstrconv.Itoa(porsi), atau pakaifmt.Sprintf.
Package strings
Package strings berisi fungsi untuk mengolah teks. Tiap fungsi mengembalikan string baru, aslinya tetap.
pesanan := "bakso urat, es teh"
fmt.Println(strings.ToUpper(pesanan)) // BAKSO URAT, ES TEH
fmt.Println(len(pesanan)) // 18
fmt.Println(strings.Contains(pesanan, "teh")) // true
fmt.Println(strings.Replace(pesanan, "es teh", "es jeruk", 1)) // bakso urat, es jeruk
fmt.Println(strings.Split(pesanan, ", ")) // [bakso urat es teh]
fmt.Println(strings.TrimSpace(" bakso urat ")) // bakso urat
strings.ToUpper(s)membuat semua huruf jadi kapital,strings.ToLower(s)sebaliknya.len(s)adalah fungsi bawaan, bukan bagianstrings, dan menghitung byte. Teks yang semuanya huruf biasa (ASCII) punya jumlah byte sama dengan jumlah hurufnya:"bakso urat, es teh"ada 18, spasi dan koma ikut dihitung.strings.Contains(s, "teh")menjawabtruekalausmemuat"teh".strings.Replace(s, lama, baru, n)menggantinkemunculan pertama.n= 1 cuma yang pertama,n= -1 semuanya (sama denganstrings.ReplaceAll).strings.Splitmemotong teks jadi beberapa bagian,strings.TrimSpacemembuang spasi di awal dan akhir.
fmt.Sprintf: merakit teks
fmt.Sprintf bekerja seperti Printf, tapi hasilnya dikembalikan sebagai string, gak dicetak. Cocok untuk merakit baris struk:
struk := fmt.Sprintf("%s pesan %d porsi", nama, 3)
fmt.Println(struk) // André pesan 3 porsi
Byte dan rune
Huruf é disimpan dalam 2 byte, jadi len("André") hasilnya 6, bukan 5. Itu jawaban tebakannya. Satu huruf utuh disebut rune: tipe rune (nama lain int32) menyimpan nomor Unicode satu karakter, dan ditulis dengan kutip tunggal, seperti 'é'.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
nama := "André"
fmt.Println(len(nama)) // 6
fmt.Println(utf8.RuneCountInString(nama)) // 5
fmt.Println(nama[0], nama[4]) // 65 195
for i, r := range nama {
fmt.Printf("%d:%c ", i, r)
}
fmt.Println()
}
6
5
65 195
0:A 1:n 2:d 3:r 4:é
utf8.RuneCountInString(nama)menghitung huruf, hasilnya 5. Cara lain:len([]rune(nama)).nama[4]mengambil byte ke-4, bukan huruf ke-4:195, keping pertama darié.for i, r := range namamengulang per rune.iadalah posisi byte tempat huruf itu mulai,rhurufnya. Perhatikanémulai di posisi 4 dan gak ada posisi 5: dua keping dibaca jadi satu huruf. Detailforada di pelajaran for nanti.%cmencetak rune sebagai karakter. Contoh lain:"hålö"punya 4 huruf, tapilen-nya 6.
⚠️ Jebakan yang sering ketemu
- Mengubah satu huruf di string.
nama[0] = 'a'gagal dengancannot assign to nama[0] (neither addressable nor a map index expression). String immutable, jadi buat string baru, misalnya denganstrings.Replace. string(angka)buat angka jadi teks.string(65)hasilnya"A", huruf dengan nomor 65, bukan"65". Pakaistrconv.Itoa(65).- Kutip tunggal untuk teks.
'André'gagal denganmore than one character in rune literal. Kutip tunggal cuma untuk satu rune. - Lupa
ndistrings.Replace. Dengann= 1, cuma kemunculan pertama yang diganti.
TL;DR: String Go adalah deretan byte UTF-8 yang immutable. Kutip ganda memproses escape seperti \n, backtick adalah raw string literal yang mengambil semuanya apa adanya. + menyambung string, angka diubah dulu dengan strconv.Itoa atau fmt.Sprintf. Package strings: ToUpper, Contains, Replace(s, lama, baru, n), Split, TrimSpace, dan semuanya mengembalikan string baru. fmt.Sprintf mengembalikan teks berformat tanpa mencetak. len menghitung byte: len("André") = 6, len("hålö") = 6. Hitung huruf dengan utf8.RuneCountInString, dan for i, r := range memberi rune utuh.