
在 Go 中使用 net/http 启动 HTTP 服务器时,可通过 log.Println 在 ListenAndServe 调用前打印启动提示,并用 log.Fatal 统一处理监听失败的异常,确保日志清晰、服务健壮。
在 go 中使用 `net/http` 启动 http 服务器时,可通过 `log.println` 在 `listenandserve` 调用前打印启动提示,并用 `log.fatal` 统一处理监听失败的异常,确保日志清晰、服务健壮。
Go 的 http.ListenAndServe 是一个阻塞式调用——一旦端口监听成功,它将一直运行并等待请求,不再返回;只有在监听失败(如端口被占用、权限不足等)时才会返回错误。因此,正确的日志时机是在调用 ListenAndServe 之前打印“服务器已启动”,并在其后使用 log.Fatal 捕获并终止异常流程。
以下是推荐的实现方式:
package main
import (
"log"
"net/http"
)
func MyHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("Hello, World!"))
}
func main() {
addr := ":8080"
http.HandleFunc("/", MyHandler)
log.Printf("✅ Server is started at http://localhost%s", addr)
log.Fatal(http.ListenAndServe(addr, nil))
}
✅ 输出示例:
2024/06/15 10:30:45 ✅ Server is started at http://localhost:8080
⚠️ 注意事项:
- 不要将 log.Println 放在 ListenAndServe 之后——该语句永远不会执行;
- 使用 log.Printf 可插入动态变量(如端口、主机名),提升可读性;
- log.Fatal 会在 ListenAndServe 返回非 nil 错误时自动调用 log.Println 并 os.Exit(1),避免静默失败;
- 如需更灵活的日志控制(如输出到文件、添加时间戳或结构化字段),可结合 log.SetOutput 或第三方库(如 zap、zerolog)扩展。
通过这一模式,你既能获得清晰的启动确认,又能确保错误场景下有明确的失败反馈,是 Go Web 服务初始化的标准实践。











