我正在编写 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/