How do I parse URLs in the format of /id/123 not ?foo=bar

You can try using regular expression as follow:

import "regexp"

re, _ := regexp.Compile("/id/(.*)")
values := re.FindStringSubmatch(path)
if len(values) > 0 {
    fmt.Println("ID : ", values[1])
}

Here is a simple solution that works for URLs with the same structure as yours (you can improve to suit those with other structures)

package main

import (
       "fmt"
       "net/url"
)

var path = "http://localhost:8080/id/123"

func getFirstParam(path string) (ps string) {

     // ignore first '/' and when it hits the second '/'
     // get whatever is after it as a parameter
     for i := 1; i < len(path); i++ {
         if path[i] == '/' {
            ps = path[i+1:]
         }
     }
     return
}

func main() {

     u, _ := url.Parse(path)
     fmt.Println(u.Path)                // -> "/id/123"

     fmt.Println(getFirstParam(u.Path)) // -> "123"
}

Or, as @gollipher suggested, use the path package

import "path"

func main() {
    u, _ := url.Parse(path)
    ps := path.Base(u.Path)
}

With this method it's faster than regex, provided you know before hand the structure of the URL you are getting.


In your example /id/123 is a path and you can get the "123" part by using Base from the path module.

package main

import (
    "fmt"
    "path"
)

func main() {
    fmt.Println(path.Base("/id/123"))
}

For easy reference, here's the docs on the path module. http://golang.org/pkg/path/#example_Base

Tags:

Go