在GAE

2015-10-19 100 views
1

FUNC的init()的第二次執行我有非常簡單的代碼,我。去文件:在GAE

func init() { 
http.HandleFunc("/", handlerMain) 
log.Println("init executed") 
} 

func handlerMain(w http.ResponseWriter, r *http.Request) { 
fmt.Fprintf(w, "TEST") 
} 

和app.yaml中:

application: newsboard 
version: 1 
runtime: go 
api_version: go1 

handlers: 
- url: /.* 
    script: _go_app 

當第一的一切而被執行罰款,這是從控制檯

INFO  2015-10-19 19:28:56,626 devappserver2.py:763] Skipping SDK update check. 
INFO  2015-10-19 19:28:56,652 api_server.py:205] Starting API server at: http://localhost:56946 
INFO  2015-10-19 19:28:56,655 dispatcher.py:197] Starting module "default" running at: http://localhost:8080 
INFO  2015-10-19 19:28:56,658 admin_server.py:116] Starting admin server at: http://localhost:8000 
2015/10/19 19:28:59 init executed 

輸出但是當我進入http://localhost:8080我得到以下幾點:

INFO  2015-10-19 19:32:16,394 module.py:786] default: "GET/HTTP/1.1" 200 4 
2015/10/19 19:32:16 init executed 

因此,init()以某種方式被執行兩次。然後,每當我重新加載頁面時,「執行init」不再出現在控制檯中。 我的問題:爲什麼init()發生兩次,這是好嗎?

回答

2

這很好。

Go AppEngine SDK監視應用程序的代碼庫,並且每當它檢測到更改(例如,您修改了.go源文件)時,它都會自動重新加載應用程序。這包括/涉及卸載您的代碼並重新加載它 - 再次運行init()函數。

基本上控制應用程序何時被重新加載 - 因此執行init()函數 - 掌握在SDK的「手中」。嘗試修改.go文件並在瀏覽器中進行刷新:您將遇到另一個init()函數執行。

當你第一次啓動你的應用程序時,所有代碼都被加載/編譯(並且init()函數被執行) - 這需要完成以報告是否有錯誤。之後,SDK可能會卸載它(不確定 - 無法找到相關文檔),只有在請求確實發生(可能或不可能很快發佈)時纔會再次加載它。

+0

但是當我第一次訪問我的本地主頁時究竟發生了什麼?我認爲它不會做任何可以被認爲是代碼修改的東西 – Kaign

+0

@Kaign請參閱編輯答案。 – icza