猿问

GAE中func init()的第二次执行

我有非常简单的代码,我的 .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() 不知何故被执行了两次。然后,每次当我重新加载页面时一切正常,控制台中不再出现“初始化执行”。我的问题:为什么 init() 发生两次,这可以吗?


哔哔one
浏览 171回答 1
1回答

白衣非少年

完全没问题。Go AppEngine SDK 监视应用程序的代码库,并且每当它检测到更改(例如,您修改了.go源文件)时,它都会自动重新加载您的应用程序。这包括/涉及卸载您的代码并重新加载它 -init()再次运行功能。基本上控制何时重新加载应用程序 - 因此执行init()功能 - 在 SDK 的“手中”。尝试修改.go文件并在浏览器中点击刷新:您将体验另一个init()功能执行。当你第一次启动你的应用程序时,所有的代码都被加载/编译(并且init()函数被执行)——这需要完成以便报告是否有错误。之后,SDK 可能会卸载它(不确定 - 找不到相关文档),并且只有在确实发生请求(可能很快也可能不会很快到来)时才再次加载它。
随时随地看视频慕课网APP

相关分类

Go
我要回答