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

4 回复

终止已在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工具),这样每次保存代码时服务器会自动重启,避免端口占用问题。

回到顶部