Golang中为什么无法从main函数调用ListenAndServe

Golang中为什么无法从main函数调用ListenAndServe 大家好,

为什么我无法在主函数中进行 HTTP 监听?

func main() {
//handleallRequests()            // 启用这行并禁用下一行可以工作
http.ListenAndServe("8081" , nil)    -> 这不起作用 - 程序退出
}
func handleallRequests() {
http.ListenAndServe(":8081", nil)   -> 这可以工作
}
4 回复

Gowtham_Girithar:

http.ListenAndServe("8081" , nil)

http.ListenAndServe 需要接收地址和端口,例如 :8081 表示 localhost:8081。你只写了 8081 是错误的。

更多关于Golang中为什么无法从main函数调用ListenAndServe的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你没有设置处理器(为nil)。尝试以下代码:

package main

import (
	"fmt"
	"net/http"
)

type CustomHandler int

func (handler CustomHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
	fmt.Println("the handler")
}

func main() {
	var handler CustomHandler
	err := http.ListenAndServe(":8081" , handler)
	if err != nil {
		panic(err)
	}
}

你在main函数和handleallRequests函数中的语句不一致。

http.ListenAndServe(“8081”, nil) -> 这个不工作 - 程序退出 http.ListenAndServe(":8081", nil) -> 这个可以工作

ListenAndServe方法期望接收IP:PORT格式的字符串,如果你不想指定IP,可以只写**:PORT**。在main函数中你缺少了":",而在其他函数中你使用了":"。这就是为什么你无法从main函数成功启动服务器的原因。

你可以用**log.Println(http.ListenAndServe(":8081", nil))**来包装这段代码,这样你就能立即知道错误信息!!!

func main() {
    fmt.Println("hello world")
}

在Go语言中,http.ListenAndServe 函数会阻塞当前goroutine,直到服务器停止运行。当你在 main 函数中直接调用它时,程序会等待HTTP服务器运行,但一旦 main 函数执行完毕,整个程序就会退出,导致服务器无法持续监听。

在你的代码中,handleallRequests 函数能够工作是因为它被调用后,main 函数会等待它执行(由于 ListenAndServe 是阻塞的),从而防止程序立即退出。而直接在主函数中调用时,如果没有其他代码阻止 main 函数退出,程序就会终止。

以下是示例代码,展示如何在 main 函数中正确使用 ListenAndServe

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })
    
    // 直接调用 ListenAndServe,它会阻塞 main 函数
    err := http.ListenAndServe(":8081", nil)
    if err != nil {
        fmt.Println("Server failed:", err)
    }
}

在这个例子中,http.ListenAndServemain 函数中调用,由于它是阻塞的,main 函数不会立即退出,服务器可以持续运行。如果 ListenAndServe 返回错误(例如端口被占用),程序会打印错误信息并退出。

确保你的代码中没有其他goroutine或逻辑导致 main 函数提前退出。如果问题仍然存在,检查是否有其他错误或日志输出。

回到顶部