String di Go — Go

String di Go String di Go adalah immutable — sekali dibuat, isinya tidak bisa diubah. Untuk memanipulasi string, kita menggunakan package strings dan fmt…

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

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

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:é

⚠️ Jebakan yang sering ketemu

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.

Yang akan kamu pelajari