Menu

String di Golang: Split, Join, Contains, Replace, dan Lainnya

Bekerja dengan string di Go: package strings (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), membangun string secara efisien dengan strings.Builder, raw string multibaris, sifat immutable, dan kenapa len menghitung byte.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

String di Go adalah urutan byte yang immutable, biasanya berupa teks UTF-8. Operator bekerja langsung pada string-nya (+, ==, <, indeks, slicing), dan semua hal lain ada di package standar strings.

Memecah string

FungsiMemecah diCatatan
Split(s, sep)setiap sepmenyimpan bagian kosong; Split("", ",") mengembalikan [""], satu string kosong
SplitN(s, sep, n)paling banyak n bagianbagian terakhir berisi sisanya
SplitAfter(s, sep)setiap sepmenyimpan pemisah di setiap bagian
Fields(s)deretan spasitidak pernah mengembalikan bagian kosong
FieldsFunc(s, f)karakter yang membuat f bernilai truepemisah sendiri
Cut(s, sep)hanya sep yang pertamamengembalikan bagian sebelum, sesudah, dan found (Go 1.18)

Kasus Split("", ",") sering menjebak: input kosong menghasilkan slice dengan panjang 1, bukan 0. Saat memecah input pengguna, Fields atau pemeriksaan s == "" lebih dulu mencegah munculnya elemen kosong yang tidak diinginkan.

strings.Cut adalah cara paling rapi untuk memecah key=value, user@host, dan pasangan sejenis. Go 1.24 juga menambahkan versi iterator, strings.SplitSeq dan strings.FieldsSeq, yang menghasilkan bagian satu per satu tanpa membuat slice.

Mencari

FungsiMengembalikan
Contains(s, sub)true jika sub muncul di s
ContainsAny(s, chars)true jika salah satu karakter dari chars muncul
HasPrefix(s, p) / HasSuffix(s, p)true jika s diawali atau diakhiri dengan p
Index(s, sub)posisi byte dari kecocokan pertama, atau -1
LastIndex(s, sub)posisi byte dari kecocokan terakhir, atau -1
Count(s, sub)jumlah kecocokan yang tidak saling tumpang tindih
EqualFold(a, b)kesamaan tanpa membedakan huruf besar dan kecil

Semua pencarian membedakan huruf besar dan kecil, kecuali EqualFold. Untuk mencari tanpa membedakannya, ubah kedua sisi menjadi huruf kecil, atau pakai EqualFold untuk membandingkan string secara utuh.

Mengubah string

Ada satu jebakan: Trim, TrimLeft, dan TrimRight menerima kumpulan karakter, bukan prefix. strings.TrimLeft("abcab", "ab") menghapus setiap a dan b di awal dan mengembalikan "cab". Untuk menghapus prefix atau suffix yang persis, pakai TrimPrefix dan TrimSuffix.

Penggabungan dan strings.Builder

+ menggabungkan string, dan fmt.Sprintf memformat nilai-nilai menjadi satu string. Keduanya mengalokasikan string baru setiap kali, karena string bersifat immutable. Itu tidak masalah untuk beberapa operasi saja, tetapi lambat di dalam perulangan, karena setiap += menyalin semua yang sudah dibangun sejauh ini. Pakai strings.Builder:

strings.Builder yang masih berupa zero value sudah siap dipakai. Ia mengimplementasikan io.Writer, jadi fmt.Fprintf bisa langsung menulis ke dalamnya. Panggil b.Grow(n) lebih dulu kalau kamu tahu kira-kira seberapa besar hasilnya nanti. Jangan menyalin Builder setelah kamu menulis ke dalamnya; kirim pointer-nya.

String multibaris dan raw string

Go punya dua jenis string literal:

String dengan tanda kutip ganda memproses escape (\n, \t, \", \\, \u00e9) dan harus muat dalam satu baris. Raw string dengan backquote mengambil semuanya apa adanya, termasuk baris baru, sehingga inilah cara menulis string multibaris, regular expression, JSON, dan path Windows. Raw string tidak bisa berisi backquote, dan carriage return di dalamnya dibuang. Perhatikan bahwa query di atas diawali baris baru, karena literal-nya dimulai tepat setelah backquote pembuka.

Panjang, indeks, dan substring

len(s) adalah jumlah byte. s[i] adalah sebuah byte, dan s[i:j] adalah substring berdasarkan posisi byte:

ï dan é masing-masing memakan dua byte, jadi string ini berukuran 12 byte dan 10 karakter. Slicing berdasarkan byte aman selama posisinya berasal dari strings.Index atau fungsi sejenis, yang mengembalikan offset byte di batas karakter. Untuk mengambil "n karakter pertama", ubah dulu menjadi []rune. Halaman rune dan byte menjelaskan UTF-8 secara mendalam.

String bersifat immutable

Kamu tidak bisa mengubah sebuah byte di tempat: s[0] = 'H' adalah error kompilasi (cannot assign to s[0] (neither addressable nor a map index expression)). Setiap fungsi di strings mengembalikan string baru. Untuk mengubah isi string, ubah menjadi []byte atau []rune, ubah slice-nya, lalu ubah kembali:

b := []byte("hello")
b[0] = 'H'
s := string(b) // "Hello"

Sifat immutable ini juga yang membuat substring murah: s[2:5] berbagi memori dengan s, bukan menyalinnya. Sisi buruknya, substring kecil dari string yang sangat besar membuat seluruh string besar itu tetap tersimpan di memori. Pakai strings.Clone (Go 1.20) saat kamu menyimpan potongan pendek dari input yang besar.

Membandingkan string

== dan != membandingkan isinya, sedangkan < dan > membandingkan byte demi byte, yang sama dengan urutan alfabet untuk ASCII. strings.Compare memang ada, tetapi jarang dibutuhkan; slices.Sort pada []string memakai <. Untuk pengurutan teks non-Inggris yang mengikuti aturan locale, pakai golang.org/x/text/collate.

Mengubah tipe lain

Angka menjadi string dengan strconv.Itoa, strconv.FormatFloat, atau fmt.Sprintf, dan string menjadi angka dengan strconv.Atoi dan strconv.ParseFloat. Jangan menulis string(42): hasilnya adalah karakter dengan code point 42, yaitu "*". Halaman konversi tipe punya tabel lengkapnya.

Pertanyaan yang sering diajukan

Bagaimana cara memecah string di Go?

Pakai strings.Split(s, sep): strings.Split("a,b,c", ",") mengembalikan ["a" "b" "c"]. Untuk memecah di setiap deretan spasi dan membuang bagian yang kosong, pakai strings.Fields(s). strings.SplitN membatasi jumlah bagian, dan strings.Cut memecah sekali di sekitar pemisah pertama.

Bagaimana cara menulis string multibaris di Go?

Pakai raw string literal di dalam backquote:

query := `SELECT id, name
FROM users
WHERE active = true`

Semua yang ada di antara backquote diambil apa adanya, termasuk baris baru dan backslash. Raw string tidak bisa berisi backquote.

Bagaimana cara memeriksa apakah sebuah string berisi substring di Go?

strings.Contains(s, substr) mengembalikan bool. Fungsi yang terkait: strings.HasPrefix, strings.HasSuffix, strings.Index (posisi atau -1), strings.ContainsAny (salah satu dari sekumpulan karakter), dan strings.EqualFold untuk kesamaan tanpa membedakan huruf besar dan kecil.

Apa cara tercepat untuk menggabungkan string di Go?

Untuk beberapa string saja, + sudah cukup. Saat membangun string di dalam perulangan, pakai strings.Builder: panggil WriteString berulang kali dan String() sekali di akhir. += yang diulang di dalam perulangan menyalin seluruh string setiap kali, jadi makin lambat saat string-nya makin panjang. Untuk menggabungkan slice dengan pemisah, pakai strings.Join.

Kenapa len memberi panjang string yang salah?

len(s) mengembalikan jumlah byte, bukan karakter. String Go berformat UTF-8, dan karakter di luar ASCII memakan 2 sampai 4 byte, jadi len("héllo") bernilai 6. Pakai utf8.RuneCountInString(s) untuk jumlah code point Unicode.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai