我正在编写一种框架,我想初始化此框架的http服务器部分。所以基本上我有一个如下所示的包internal
,它由框架中间件导入:
package internal
import(
"net/http"
"log"
)
func main() {
checkHealth(http.DefaultServeMux)
if err := http.ListenAndServe(":8080", http.HandlerFunc(handleHTTP)); err != nil {
log.Fatalf("http.ListenAndServe: %v", err)
}
}
在应用程序代码中,我希望在init函数中定义处理程序。 例如
func init() {
http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, world!")
}
但是,如果我在应用程序代码目录/包中运行go build
,则会错误地指出主函数未定义:
runtime.main_main: main.main: not defined
runtime.main_main: undefined: main.main
所以我的问题是我应该如何构建/编译程序以及为什么使用标准go build
命令它找不到内部包中定义的主函数。
答案 0 :(得分:4)
main
功能必须位于main
包中:Program Execution
程序执行从初始化主包然后调用main函数开始。当该函数调用返回时,程序退出。它不会等待其他(非主要)goroutines完成。
如果您希望程序包在启动时初始化某个状态,或者通过简单导入它而产生副作用,则使用init function
。然而,init必须返回,因此您无法阻止它http.ListenAndServe
。