2012년 2월 15일 수요일

go용 routing module을 만들고 있다.

ror/sinatra 나 express.js 처럼 우아한 routing쓰고 싶은데
연습삼아 만들어보자는 생각에 서툰 코딩을 시작
/user/:userid 인 경우 \/user\/([^\/]+)\/? 이런 식으로 우아하게 정규식 치환을 했으면 했는데
string 패키지도 좀 볼겸. 단순하게 문자열 조작+뺑뺑이로 구현했다.
https://gist.github.com/1827639


package main
import "fmt"
import "strings"
var routes = []string{
  "/user/:id/friends/:friendsId",
  "/scrapbook/:scrapbookid/scrap/:scrapid",
  "/"}
func getParams(url string) map[string]string {
  for idx,_:=range routes {
    format := routes[idx]
    urlToken := strings.Split(url, "/")
    formatToken := strings.Split(format, "/")
    /* match pattern */
    if len(urlToken)==len(formatToken) && len(formatToken)>0 {
      params := make(map[string]string)
      match := true
      for i,v:=range formatToken {
        if len(v)>0 && v[0:1] == ":" {
          params[v[1:]]=urlToken[i]
        } else if v!=urlToken[i] {
          match =false
        }
      }
      if match {
        return params
      }
    }
  }
  return nil
}
func main() {
  for i,v:=range getParams("/scrapbook/1ABCDE/scrap/401") {
    fmt.Printf("[%s:%s]",i,v)
  }
  fmt.Println("")
  for i,v:=range getParams("/user/spectrum/friends/cid") {
    fmt.Printf("[%s:%s]",i,v)
  }
  fmt.Println("")
  for i,v:=range getParams("/root") {
    fmt.Printf("[%s:%s]",i,v)
  }
  fmt.Println("")
}


웹에서 코드실행


/user/:id/friends/:friendsId
/scrapbook/:scrapbookid/scrap/:scrapid

에서 각각 :으로 시작하는 인자값을 뽑아낸다.

정적 타이핑 언어치고 재미있네. 에휴 Dennis Ritchie옹 생각에 눙무리 ;;ㅅ;;