为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
哔哔one 2021-11-15 17:19:49
我有非常简单的代码,我的 .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: newsboardversion: 1runtime: goapi_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:56946INFO     2015-10-19 19:28:56,655 dispatcher.py:197] Starting module "default" running at: http://localhost:8080INFO     2015-10-19 19:28:56,658 admin_server.py:116] Starting admin server at: http://localhost:80002015/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 42015/10/19 19:32:16 init executed所以 init() 不知何故被执行了两次。然后,每次当我重新加载页面时一切正常,控制台中不再出现“初始化执行”。我的问题:为什么 init() 发生两次,这可以吗?
查看完整描述

1 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

完全没问题。

Go AppEngine SDK 监视应用程序的代码库,并且每当它检测到更改(例如,您修改了.go源文件)时,它都会自动重新加载您的应用程序。这包括/涉及卸载您的代码并重新加载它 -init()再次运行功能。

基本上控制何时重新加载应用程序 - 因此执行init()功能 - 在 SDK 的“手中”。尝试修改.go文件并在浏览器中点击刷新:您将体验另一个init()功能执行。

当你第一次启动你的应用程序时,所有的代码都被加载/编译(并且init()函数被执行)——这需要完成以便报告是否有错误。之后,SDK 可能会卸载它(不确定 - 找不到相关文档),并且只有在确实发生请求(可能很快也可能不会很快到来)时才再次加载它。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信