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 OAuth 端点在生产中抛出 400

c# - 当我从 HTTP 重定向到 HTTPS 时,用户必须重新登录

c# - HttpClient 没有获得完整的网站 html 源代码

google-app-engine - 为 dart 设置应用程序引擎,gcloud 预览错误

java - 如何在实际遍历所有结果之前获取 App Engine 查询中的结果数

java - 为什么这个缓冲区以下面的方式初始化?

C struct自动初始化值,数组初始化

c++ - Windows C++下链接库中的静态初始化

http - 浏览器扩展是否应该更改它发起的请求的 User-Agent header ?

python - 如何检查请求帖子是否已成功发布?