這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前幾日寫一個網頁的簡單計數器問題時發現,計數器居然永遠為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隱式傳遞指標,但是不隱式定義指標,此坑需同學們注意。