URL parsing
Bedah alamat URL menjadi komponen-komponennya.
Pahami konsepnya
net/url mengurai alamat menjadi struktur teratur. url.Parse(teks) menghasilkan *url.URL dengan field siap baca: Scheme (https), Host (domain:port), Path (jalur), RawQuery (query mentah), Fragment (#bagian). Parse juga memvalidasi — alamat cacat mengembalikan error.
Query adalah bagian yang paling sering diolah: u.Query() mengubahnya menjadi url.Values — map[string][]string dengan method Get(kunci) untuk nilai pertama. Karena satu parameter bisa muncul berkali (?a=1&a=2), nilainya memang berbentuk slice; Encode() mengemas balik menjadi query string rapi dengan escaping benar.
Konstruksi arah sebaliknya juga mulus: buat url.Values, isi, lalu Encode untuk menyematkan pada URL keluar — cara aman membangun query tanpa menyusun string manual dan lupa escape karakter seperti spasi atau &.
Coba contoh kode
package main
import (
"fmt"
"net/url"
)
func main() {
u, err := url.Parse("https://api.contoh.dev/v1/cari?q=golang&halaman=2&tag=web&tag=cli")
if err != nil {
return
}
fmt.Println(u.Scheme, u.Host, u.Path)
q := u.Query()
fmt.Println(q.Get("q"), q.Get("halaman"), q["tag"])
}Tiga bagian alamat tercetak terpisah: https, api.contoh.dev, /v1/cari. Get mengambil nilai tunggal (q=golang, halaman=2) sedangkan akses map langsung q["tag"] menghasilkan seluruh nilai berulang [web cli] — pilihan bentuk mengikuti kebutuhan.
Membangun query dengan aman
func main() {
q := url.Values{}
q.Set("q", "belajar go gratis")
q.Set("halaman", "3")
alamat := "https://contoh.dev/cari?" + q.Encode()
fmt.Println(alamat)
// https://contoh.dev/cari?halaman=3&q=belajar+go+gratis
}Spasi pada "belajar go gratis" otomatis menjadi + dan pasangan diurutkan — Encode menjamin query valid tanpa kamu menghafal aturan escaping. Menyusun query lewat Values selalu lebih aman daripada merangkai string + "?" + teks mentah.
Latihan singkat
Uji: ambil nilai `q` dan tag KEDUA — program harus mencetak persis `golang cli`.