6. Proyek Akhir — Web Server
Saatnya menggabungkan semuanya: kita bangun web server kecil seperti aplikasi profil di gstnv-lab.xyz — hanya dengan pustaka standar Go.
Web server dalam 15 baris
Section titled “Web server dalam 15 baris”package main
import ( "fmt" "log" "net/http")
func main() { mux := http.NewServeMux()
mux.HandleFunc("GET /{$}", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Halo dari server Go!") })
log.Println("listening on :8080") log.Fatal(http.ListenAndServe(":8080", mux))}| Bagian | Arti |
|---|---|
http.NewServeMux() |
router: mencocokkan path dengan handler |
"GET /{$}" |
hanya method GET dan path / persis (Go 1.22+) |
w http.ResponseWriter |
tempat menulis jawaban ke pengunjung |
r *http.Request |
permintaan pengunjung: method, path, header |
fmt.Fprintln(w, ...) |
seperti Println, tapi menulis ke w |
http.ListenAndServe(":8080", mux) |
dengarkan port 8080 — fungsi ini tidak pernah selesai selama server hidup |
Pola rute (Go 1.22+)
Section titled “Pola rute (Go 1.22+)”mux.HandleFunc("GET /health", ...) // path persismux.HandleFunc("GET /halo/{nama}", ...) // {nama} = bagian path yang berubahmux.HandleFunc("POST /pesan", ...) // method lain → 405 Method Not Allowedmux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))Nilai {nama} dibaca dengan r.PathValue("nama").
Siklus kerja server
Section titled “Siklus kerja server”-
go run .— server menyala. Di terminal latihan, server berjalan di background dan PID-nya ditampilkan. -
curl localhost:8080— uji dari terminal yang sama. -
Ubah kode? Matikan server lama dulu dengan
kill PID. Kalau tidak, server baru gagal karena port masih dipakai:listen tcp :8080: bind: address already in use -
go run .lagi, lalu uji ulang.
Compile jadi binary
Section titled “Compile jadi binary”go build # hasil: file ./webku (nama dari go.mod)./webku # jalan tanpa perlu Go terpasangBinary inilah yang disalin ke server. Mau compile untuk sistem lain? Atur GOOS dan GOARCH:
GOOS=linux GOARCH=arm64 go build -o webku-arm # untuk Raspberry Pi / server ARMLab: Proyek akhir: web server Go
Misi 0/7
- Masuk ke
webkulalu nyalakan servernya dengango run .Petunjuk
cd webku && go run . - Uji dengan
curl localhost:8080.Petunjuk
curl localhost:8080 - Matikan servernya dengan
kill PID(lihat PID di output tadi atau dips aux).Petunjuk
ps aux | grep main lalu kill PID - Tambahkan rute
GET /healthyang menjawabok, nyalakan ulang, lalucurl localhost:8080/health.Petunjuk
mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "ok") }) - Tambahkan rute
GET /halo/{nama}yang menjawabHalo, NAMA!memakair.PathValue("nama"). Uji dengancurl localhost:8080/halo/budi.Petunjuk
fmt.Fprintf(w, "Halo, %s!\n", r.PathValue("nama")) — ingat: kill server lama dulu, lalu go run . lagi - Matikan server lalu compile jadi satu file binary:
go build.Petunjuk
kill PID lalu go build (hasilnya file ./webku) - Jalankan binary-nya tanpa
go:./webku, lalucurl localhost:8080/health.Petunjuk
./webku lalu curl localhost:8080/health
GNU nano ·
Tab = indentasi
Selamat! 🎉
Section titled “Selamat! 🎉”Kamu sudah menulis program Go, menangani error, menguji kode, dan membangun web server. Langkah berikutnya:
- Ikuti Tour of Go untuk fitur yang belum dibahas: interface, goroutine, dan channel.
- Bungkus web server-mu dengan Dockerfile, lalu pasang di balik nginx.

