Go versi 1.22, pada saat artikel ini ditulis, masih dalam status unstable sehingga belum dirilis secara publik. Namun, kita sudah dapat mencoba fitur-fitur barunya jika sebelumnya sudah pernah menginstal Go versi berapa pun di mesin kita.

Untuk menginstal Go 1.22 RC1, jalankan perintah berikut:

$ go install golang.org/dl/go1.22rc1@latest

Salah satu fitur yang sangat menarik dan sudah lama dinantikan banyak developer adalah dukungan routing berbasis method langsung di dalam standard library net/http. Fitur ini membuat penulisan kode menjadi lebih sederhana dan ekspresif.

Routing di Go <1.21

Pada Go versi 1.21 ke bawah, jika ingin membuat dua route dengan HTTP method berbeda pada path yang sama, biasanya dilakukan seperti berikut:

mux := http.NewServeMux()

mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        fmt.Fprint(w, "/users GET")
    } else if r.Method == "POST" {
        fmt.Fprint(w, "/users POST")
    } else {
        http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
    }
})

log.Println("server running at :3000")
http.ListenAndServe(":3000", mux)

Pada contoh di atas, kita harus melakukan pengecekan method secara manual di dalam handler. Jika ada request dengan method selain GET atau POST, sebaiknya juga mengembalikan status Method Not Allowed.

Contoh hasil request menggunakan curl:

$ curl -X GET http://localhost:3000/users
/users GET

$ curl -X POST http://localhost:3000/users
/users POST

Routing di Go 1.22

Mulai Go 1.22, net/http.ServeMux mendukung pola baru yang memungkinkan kita menentukan HTTP method langsung pada pola route. Ini membuat kode lebih bersih dan mudah dipahami.

mux := http.NewServeMux()

mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "/users GET")
})

mux.HandleFunc("POST /users", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "/users POST")
})

log.Println("server running at :3000")
http.ListenAndServe(":3000", mux)

Dengan pola "POST /users", handler hanya akan menangani request POST ke /users. Sedangkan handler tanpa prefix method akan menangani GET (dan HEAD secara default).

Contoh hasil request menggunakan curl:

$ curl -X GET http://localhost:3000/users
/users GET

$ curl -X POST http://localhost:3000/users
/users POST

Jika Anda mencoba method lain yang tidak didaftarkan, server akan otomatis mengembalikan status 405 Method Not Allowed.

Keuntungan Pola Baru

  • Lebih ekspresif: Penulisan route dan method lebih jelas.
  • Lebih aman: Tidak perlu lagi pengecekan manual method di handler.
  • Lebih mudah dirawat: Handler untuk setiap method bisa dipisah sesuai kebutuhan.

Referensi