我的代码非常简单,我的.go文件:
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()不知何故被执行了两次。然后,每次当我重新加载页面时,everething都没问题,“init execution”不再出现在控制台中。 我的问题:为什么init()会发生两次,这没关系吗?
答案 0 :(得分:2)
完全没问题。
Go AppEngine SDK监控应用程序的代码库,每当它检测到更改时(例如,您修改了.go
源文件),它会自动重新加载您的应用程序。这包括/涉及卸载代码并重新加载 - 再次运行init()
函数。
基本上控制何时重新加载应用程序 - 因此执行init()
功能 - 都在SDK的“手中”。尝试修改.go
文件并在浏览器中点击刷新:您将遇到另一个init()
函数执行。
当您第一次启动应用程序时,所有代码都被加载/编译(并且init()
函数被执行) - 这需要完成以报告是否存在错误。之后,SDK可能会卸载它(不确定 - 无法找到相关文档),只有在请求确实发生时才会再次加载(可能很快也可能不会发生)。