Golang中为什么在VS Code终端使用"go run main.go"启动服务器后无法输入其他命令?
Golang中为什么在VS Code终端使用"go run main.go"启动服务器后无法输入其他命令?
为什么在 Visual Studio Code 终端中使用命令 go run main.go 启动服务器后,就无法再向终端输入其他命令了(要执行其他命令,要么重启终端,要么使用 CTRL+C 来结束当前执行)?这是因为代码有问题,还是 Visual Studio Code 终端本身的原因?我需要解决这个问题吗?另外,每次运行 go run main.go 后,Windows 防火墙也会被启用。
package main
import (
"fmt"
"net/http"
)
func home_page(page http.ResponseWriter, r *http.Request) {
fmt.Fprintf(page, "Go is super easy!!!")
}
func handleRequest() {
http.HandleFunc("/", home_page)
http.ListenAndServe(":8080", nil)
}
func main() {
handleRequest()
}
更多关于Golang中为什么在VS Code终端使用"go run main.go"启动服务器后无法输入其他命令?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
服务器会一直运行,直到被终止。
更多关于Golang中为什么在VS Code终端使用"go run main.go"启动服务器后无法输入其他命令?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个正常现象,不是代码问题,也不是VS Code终端的问题。你的代码启动了一个HTTP服务器,它会一直监听端口并处理请求,因此程序会持续运行,阻塞在 http.ListenAndServe(":8080", nil) 这一行。这导致终端被占用,无法输入新命令。
原因分析:
http.ListenAndServe是一个阻塞调用,它会启动一个无限循环来监听和处理传入的HTTP请求。- 当你在终端中运行一个前台程序时,终端会等待该程序执行完毕(即进程退出)后才能接收新的命令输入。
- 你的服务器程序不会自动退出(除非遇到错误或你手动中断),所以终端会一直被占用。
关于Windows防火墙: 这是Windows的正常安全行为。当任何程序(包括你的Go程序)首次尝试监听网络端口时,Windows Defender防火墙会弹出提示,询问是否允许该程序通过防火墙进行通信。这是为了保护你的计算机免受未经授权的网络访问。你只需要在第一次运行时选择允许即可。
示例代码说明: 你的代码完全正确,这是一个标准的Go HTTP服务器。以下是一个添加了日志输出以更清晰展示运行状态的版本:
package main
import (
"fmt"
"log"
"net/http"
)
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Go is super easy!!!")
}
func main() {
http.HandleFunc("/", homePage)
fmt.Println("Server starting on :8080...")
log.Println("Visit http://localhost:8080 in your browser")
// 这行代码会阻塞,直到服务器停止
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("Server failed to start: ", err)
}
}
解决方案:
- 打开新的终端标签/窗口:在VS Code中,你可以点击终端面板上的"+"号或使用快捷键(如Ctrl+Shift+`)打开一个新的终端标签页,在新标签页中执行其他命令。
- 后台运行:在命令前加上
start(Windows)或使用&(Unix-like系统)可以让程序在后台运行,但这在VS Code的集成终端中可能不太稳定。 - 使用任务运行器:配置VS Code的tasks.json来运行你的Go程序,这样可以在后台启动。
- 使用专门的进程管理工具:对于生产环境或长期开发,可以考虑使用
air(热重载工具)或tmux(终端多路复用器)来管理你的服务器进程。
这是服务器程序的正常行为,不需要"解决"这个阻塞问题,因为服务器就是需要持续运行的。你只需要习惯在开发时使用多个终端标签页:一个用于运行服务器,另一个用于执行其他命令(如运行测试、git操作等)。

