2016-10-16 7 views
1

로직을 이해하기 위해 golang에 자체 라우터를 구축하고 있지만 404 오류가 정상적으로 발견되지 않아 서버에 연결할 수 있지만 기능을 썼습니다. hello 이름이 실행되고 있지 않습니다. 이것에 대한 이유는 무엇일까요?어떻게 골란에 자신의 간단한 라우터를 구축?

package main 
import (
    "fmt" 
    "log" 
    "net/http" 
    "strings" 
    "time" 
) 

var Session *http.Server 
var r Router 

func Run(port string) { 
    Session = &http.Server{ 
     Addr:   port, 
     Handler:  &r, 
     ReadTimeout: 10 * time.Second, 
     WriteTimeout: 10 * time.Second, 
     MaxHeaderBytes: 1 << 20, 
    } 
    log.Fatal(Session.ListenAndServe()) 
} 

type Handle func(http.ResponseWriter, *http.Request) 

type Router struct { 
    mux map[string]Handle 
} 

func newRouter() *Router { 
    return &Router{ 
     mux: make(map[string]Handle), 
    } 
} 

func (r *Router) Add(path string, handle Handle) { 
    r.mux[path] = handle 
} 

func GetHeader(url string) string { 
    sl := strings.Split(url, "/") 
    return fmt.Sprintf("/%s", sl[1]) 
} 

func (rt *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    head := GetHeader(r.URL.Path) 
    h, ok := rt.mux[head] 
    if ok { 
     h(w, r) 
     return 
    } 
    http.NotFound(w, r) 
} 

func hello(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "%s", "hello world") 
} 

func main() { 
    r := newRouter() 
    r.Add("/hello", hello) 
    Run(":8080") 
} 

답변

4

주를 함수는 := 표기법을 사용하여 범위가 gl과 다른 r이라는 새 로컬 변수를 선언하고 초기화합니다 obal 변수가 목록의 상단에 있습니다.

은 당신이 핸들러를 추가하고있는 r 변수에 따라서 당신의 ServeHTTP가 자신의 수신기에 전혀 매핑을 찾을 수 없습니다, 당신은 Http.Server 구조체에 할당하려는 글로벌 아니다 것을 의미한다 r.
var r *Router 

및 핸들러에

, 당신이 어떤 역 참조하지 않고 직접 포인터를 전달할 수 있습니다 :

Session = &http.Server{ 
     Addr:   port, 
     Handler:  r, 
     ReadTimeout: 10 * time.Second, 
     WriteTimeout: 10 * time.Second, 
     MaxHeaderBytes: 1 << 20, 
    } 

해결책이처럼 Router에 대한 포인터로 r Router을 선언하는 것입니다 물론 포인터 값을 할당하고 새 로컬 변수를 선언하지 않고 변수를 초기화해야합니다.

func main() { 
    r = newRouter() 
    r.Add("/hello", hello) 
    Run(":8080") 
} 
0

당신은 전역 변수 var r Router이 있지만 내부 func main() 다른를 만들고, 지역의 하나의 경로는 만 추가 할 일 :

func main() { 
     r := newRouter() 
     r.Add("/hello", hello) 
     Run(":8080") 
    } 

단순히 조정

var r =&Router{} 

func Run(port string) { 
    Session = &http.Server{ 
     Addr:   port, 
     Handler:  r, 
     ReadTimeout: 10 * time.Second, 
     WriteTimeout: 10 * time.Second, 
     MaxHeaderBytes: 1 << 20, 
    } 
    log.Fatal(Session.ListenAndServe()) 
} 
func main() { 
    r = newRouter() 
    r.Add("/hello", hello) 
    Run(":8080") 
}