我对系统编程很陌生。
我有一个Go程序,它使用net/http
并启动一个http服务器。
当我构建一个Windows二进制文件并尝试使用目标Windows机器时,除了Printf
之外没有任何工作可以启动服务器。
一旦我在目标Windows机器上安装了Go,一切都开始工作了!
这是我的计划:
package main
import (
"fmt"
"log"
"os/exec"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there @%s!", r.URL.Path[1:])
}
func main() {
path, err := exec.LookPath("go")
if err != nil {
log.Fatal("Go is not your fortune :|")
}
fmt.Printf("Go is available at %s\n", path)
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
如果go
没有与其程序构建所有依赖项,那么我该怎么做呢?如果是的话,为什么它不起作用?
在运行任何Go程序之前,目标系统是否必须安装go
?
请帮忙!感谢。
答案 0 :(得分:2)
如果没有Go,您的应用无法运行,因为如果找不到go
工具,并且log.Fatal()
终止,则会致电log.Fatal()
>你的应用:
致命等同于Print(),然后调用os.Exit(1)。
如果您使用go build
或go install
发布来源,可执行二进制文件将包含所需的所有内容(有关详细信息,请参阅What does go build build?)。不要打电话给log.Fatal()
,它应该有用。
并注意:应检查并打印http.ListenAndServe()
返回的错误,例如:
panic(http.ListenAndServe(":8080", nil))
因为如果失败了,您就不会知道它为什么不起作用(例如,您已经启动了应用程序并且端口已被使用/使用)。
答案 1 :(得分:2)
不,目标系统不必为使用Go to run编译的可执行文件安装Go编译器。您可以在一台Windows计算机上使用go install
或go build
编译您的程序,将其复制到另一台安装了不的Go并在那里运行。
确保您编译的程序以package main
语句开头 - 否则只会编译库文件。
确保检查运行程序的用户是否有权侦听http服务器使用的端口。端口0-1023 - “熟知端口” - “只能由系统(或根)进程或特权用户执行的程序使用”(https://support.microsoft.com/en-us/kb/174904),因此请尝试以特权用户身份启动程序(例如,管理员)或使用非特权端口> = 1024(例如http.ListenAndServe(":8080", nil)
)应该在非特权端口上启动服务器。举一个非常简单的例子 - 例如来自https://golang.org/doc/articles/wiki/ - 看看你是否能让它发挥作用。