http - GAE Go,init() - 多次调用它?

标签 http google-app-engine initialization admin go

我正在编写 Google App Engine Go 应用程序。在其中,我想在不同的 .go 文件中分别处理一些调用。我应该在每个文件中单独调用“init()”函数,还是只在一个文件中声明它并调用一些其他函数来初始化每个 .go 文件?

例如,如果我有两个文件,user.go:

package User

import(
    "http"
    "fmt"
)

func init() {
    http.HandleFunc("/", hello)
}

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, user!")
}

和 admin.go:

package Admin

import(
    "http"
    "fmt"
)

func init() {
    http.HandleFunc("/admin/", hello)
}

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, admin!")
}

这样的初始化是否正确,还是建议不要这样做?

最佳答案

根据Go语言规范:

  • 所有初始化代码都在单个 goroutine 中运行,并且

  • 单个包中的 init() 函数以未指定的顺序执行

在您的情况下,包 User 和 Admin 是独立的(User 不导入 Admin,Admin 也不导入 User)。这意味着:

  • User 和 Admin 中的两个 init() 函数以未指定的顺序执行

将两个 init() 函数的主体合并到一个 init() 函数中看起来像这样:

func init() {
    http.HandleFunc("/", User.Hello)
    http.HandleFunc("/admin/", Admin.Hello)
}

注意程序先注册"/"还是"/admin/"是无关紧要的。所以,下面的代码也是有效的:

func init() {
    http.HandleFunc("/admin/", Admin.Hello)
    http.HandleFunc("/", User.Hello)
}

从上面两段代码可以看出,http.HandleFunc("/", ...)http.HandleFunc("/admin/", ...) 以未指定的顺序调用。


因为 "/""/admin/" 可以以任何顺序注册,并且所有 init() 函数都在一个 goroutine 中运行,所以你的答案问题是:是的,这样的初始化是正确的

关于http - GAE Go,init() - 多次调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059129/

相关文章:

python - Google App Engine httplib2 import Http 导致语法错误

java - 初始化 block 的行为

c# - 设计指定构造函数

c - 初始化 C 结构预期的表达式

java - 我能不能把 'bounce'一个文件上传到一台服务器直接发到另一台服务器?

apache - 使用 http header 在最新的 Chrome 和 firefox 中启用混合内容加载

api - 处理 API 的多个响应代码的好方法是什么?

python:从相对路径导入

git 推送错误 : Server aborted the SSL handshake

java - Java SE 和 Java EE 应用程序之间的通信