Golang输出结果总是相同怎么办
Golang输出结果总是相同怎么办 我对Golang非常陌生,刚刚安装了Goland。
我的代码很简单,如下所示:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func (w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World!")
})
http.ListenAndServe(":8080", nil)
}
当我点击运行’go build index.go’后,在浏览器中能看到"Hello World!",但我无法再修改代码了。它始终显示相同的内容。只有当我将端口更改为其他值时才能正常工作。
如何解决这个问题?
更多关于Golang输出结果总是相同怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html
终止已在8080端口运行的进程,然后重试 😊
或者你可能需要停止通过Goland创建的HTTP服务器。
更多关于Golang输出结果总是相同怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢。使用 Strg + F2(停止进程)和 Strg + F5(重新运行 go build index.go)解决了我的问题。有没有办法更改快捷键 Strg + S?它应该不仅仅保存文件,而是保存文件、停止进程并重新运行文件。在这种情况下:1. Strg + S,2. Strg + F2,3. Strg + F5
很可能的情况是,您的8080端口上已经运行了一个应用程序,因此即使您正在修改当前程序,原有程序也并未停止运行。
"简单"的解决方案是重启计算机,这应该会终止其他程序。但问题是您可能再次遇到这种情况,而且我不清楚您是如何运行代码的,也不明白这种情况最初是如何发生的,因此我无法轻松帮您解决这部分问题 😞
@francesc 曾在推特上分享过查找特定端口运行进程的方法,或许对您有帮助 - https://twitter.com/francesc/status/982025296898478080
问题在于你的服务器进程没有正确停止,导致旧版本代码仍在运行。当你修改代码后重新构建时,旧进程仍然占用8080端口,所以浏览器访问到的还是旧版本。
以下是解决方案:
方法1:手动停止进程
首先找到并停止占用8080端口的进程:
在Linux/Mac上:
# 查找占用8080端口的进程
lsof -i :8080
# 或者使用
netstat -tulpn | grep :8080
# 杀死进程(替换PID为实际进程号)
kill -9 <PID>
在Windows上:
# 查找占用8080端口的进程
netstat -ano | findstr :8080
# 杀死进程(替换PID为实际进程号)
taskkill /PID <PID> /F
方法2:使用热重载工具
安装并使用 air 工具实现热重载:
# 安装air
go install github.com/cosmtrek/air@latest
# 在项目目录下运行
air
创建 .air.toml 配置文件:
root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"
[build]
cmd = "go build -o ./tmp/main ."
bin = "tmp/main"
full_bin = "./tmp/main"
include_ext = ["go", "tpl", "tmpl", "html"]
exclude_dir = ["assets", "tmp", "vendor", "testdata"]
include_dir = []
exclude_file = []
log = "air.log"
delay = 1000
stop_on_root = false
send_interrupt = false
kill_delay = 500
rerun = false
rerun_delay = 500
[log]
time = false
[color]
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"
[misc]
clean_on_exit = true
方法3:使用Ctrl+C正确停止服务器
在终端中运行程序时,使用 Ctrl+C 来优雅地停止服务器,而不是直接关闭终端窗口。
方法4:添加优雅关闭机制
修改你的代码,添加信号处理和优雅关闭:
package main
import (
"context"
"fmt"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello World! Updated version!")
})
server := &http.Server{
Addr: ":8080",
}
// 启动服务器
go func() {
fmt.Println("Server starting on :8080")
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
fmt.Printf("Server error: %v\n", err)
}
}()
// 等待中断信号
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
fmt.Println("Shutting down server...")
// 优雅关闭
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
fmt.Printf("Server forced to shutdown: %v\n", err)
}
fmt.Println("Server exited")
}
推荐使用方法2(air工具),这样每次保存代码时服务器会自动重启,避免端口占用问题。

