.go
个文件
ls *.go | entr -r go run *.go
在单独的终端窗口中运行。
每次我保存文件时,我都可以看到它重新启动我的程序,因为每次我都会将一些格式语句打印到终端。但是,每当我导航到localhost:8080
时,我都会看到当我开始entr
时存在的处理程序内容(而不是最近更改中的内容)。如果我Ctrl+C
,然后重新启动entr
,我会看到最新的更改。
知道我做错了吗?
这是最小的例子:
// test.go
package main
import (
"fmt"
"net/http"
)
func handler (w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello there! I love %s!", r.URL.Path[1:])
}
func main() {
fmt.Println("Starting up...")
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
现在,如果我运行ls test.go | entr -r go run test.go
,我会看到Starting up...
已打印到终端,我可以转到localhost:8080/tests
查看显示"Hello there! I love tests!"
的网页。如果我更改handler
函数以使其读取
func handler (w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "I guess %s are ok...", r.URL.Path[1:])
}
我再次在终端中看到Starting up...
消息,但转到localhost:8080/tests
仍然显示"Hello there! I love tests!"
页面(即使在隐身模式下)。如果我随后终止entr
进程并重新启动它,我可以转到localhost:8080/tests
按预期查看I guess tests are ok...
。
修改:
从ListenAndServe
中获取错误,确认这与悬空套接字有关。
...
err := http.ListenAndServe(":8080", nil)
fmt.Printf("ListenAndServe ERR: %s\n", err)
...
显示额外的行
listen tcp :8080: bind: address already in use
在终端。快速搜索告诉我,没有一种简单的方法可以阻止以ListenAndServe
开头的监听器。是否有比this更简单的方法?
答案 0 :(得分:0)
问题:
go run
将在一个单独的进程中启动服务器,但不会被杀死。
解决方案: 使用一个杀死并启动服务器的小脚本
#!/bin/sh
pkill "$1"
go run "$1.go"
并将其用于entr
。