golang struct結構體方法中的引數需要定義為指標型別
阿新 • • 發佈:2019-02-02
前幾日寫一個網頁的簡單計數器問題時發現,計數器居然永遠為0,計數器不計數,見鬼了。。。
程式碼如下:
type Counter struct { n int } func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) { fmt.Fprintf(c, "%08x\n", ctr) ctr.n++ fmt.Fprintf(c, "counter = %d\n", ctr.n) } func main() { http.Handle("/counter", new(Counter)) log.Fatal("ListenAndServe: ", http.ListenAndServe(":80", nil)) }
研究一番,發現我們
func (ctr Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
應該改為
func (ctr* Counter) ServeHTTP(c http.ResponseWriter, req *http.Request)
也就是說,物件的例項必須定義為指標的型別,然後才能傳遞正確的地址,否則ctr引數只是物件的一個副本,
於是修正程式碼為:
type Counter struct { n int } func (ctr *Counter) ServeHTTP(c http.ResponseWriter, req *http.Request) { fmt.Fprintf(c, "%08x\n", ctr) ctr.n++ fmt.Fprintf(c, "counter = %d\n", ctr.n) } func main() { http.Handle("/counter", new(Counter)) log.Fatal("ListenAndServe: ", http.ListenAndServe(":80", nil)) }
計數器終於計數了。。。
總結:golang隱式傳遞指標,但是不隱式定義指標,此坑需同學們注意。