1. 程式人生 > >golang struct結構體方法中的引數需要定義為指標型別

golang struct結構體方法中的引數需要定義為指標型別

前幾日寫一個網頁的簡單計數器問題時發現,計數器居然永遠為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隱式傳遞指標,但是不隱式定義指標,此坑需同學們注意。