如何用外部主函数构建程序?

时间:2015-03-01 17:57:54

标签: go

我正在编写一种框架,我想初始化此框架的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命令它找不到内部包中定义的主函数。

1 个答案:

答案 0 :(得分:4)

main功能必须位于main包中:Program Execution

  

程序执行从初始化主包然后调用main函数开始。当该函数调用返回时,程序退出。它不会等待其他(非主要)goroutines完成。

如果您希望程序包在启动时初始化某个状态,或者通过简单导入它而产生副作用,则使用init function。然而,init必须返回,因此您无法阻止它http.ListenAndServe