2016-11-20 86 views
-3

不能創建一個服務器當試圖ListenAndServer一展身手程序內我得到一個錯誤:去:在走常規

package main 

import (
    "fmt" 
    "io/ioutil" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/static/", myHandler) 
    go func() { 
     http.ListenAndServe("localhost:80", nil) 
    }() 

    fmt.Printf("we are here") 
    resp, _ := http.Get("localhost:80/static") 

    ans, _ := ioutil.ReadAll(resp.Body) 
    fmt.Printf("response: %s", ans) 
} 

func myHandler(rw http.ResponseWriter, req *http.Request) { 
    fmt.Printf(req.URL.Path) 
} 

錯誤:

panic: runtime error: invalid memory address or nil pointer dereference 
[signal 0xc0000005 code=0x0 addr=0x48 pc=0x401102] 

goroutine 1 [running]: 
panic(0x6160c0, 0xc0420080a0) 
     c:/go/src/runtime/panic.go:500 +0x1af 
main.main() 
     C:/gowork/src/exc/14.go:20 +0xc2 
exit status 2 

所有我想要的是創造一個http服務器。然後測試它並從代碼連接到它。 Go有什麼問題? (或我嗎?)

+4

'Get' URL應該是:'http:// localhost:80/static'。調試而不是忽略你應該處理的錯誤。 –

+0

如果我忽略錯誤。爲什麼要去恐慌?如果我忽略錯誤,總是會發生什麼? – Aminadav

+0

取決於。在這種情況下,由於無效的'http.Get'調用,'resp.Body'不存在,所以拋出錯誤。與其他語言不同,Go不會引發異常,但如果函數返回一個錯誤,我們應該處理一個錯誤。 –

回答

1

您必須使用(以「http://」,在這種情況下)

resp, _ := http.Get("http://localhost:80/static") 

,並檢查錯誤,然後使用響應,公正的情況下請求失敗

resp, err := http.Get("http://localhost:80/static") 
if err != nil { 
    // do something 
} else { 
    ans, _ := ioutil.ReadAll(resp.Body) 
    fmt.Printf("response: %s", ans) 
} 

另外,如果你想從你的處理程序得到任何響應,你必須在其中寫一個響應。

func myHandler(rw http.ResponseWriter, req *http.Request) { 
    fmt.Printf(req.URL.Path) 
    rw.Write([]byte("Hello World!")) 
}