9

我想打开一个网络浏览器:

c, err := exec.Command("http://localhost:4001").Output()
if err != nil {
    fmt.Printf("ERROR: %v, %v\n",err,c)
} else {
    fmt.Printf("OK:%v\n",c)
}

我得到了错误

ERROR: exec: "http://localhost:4001": file does not exist

编辑:当你这样做时,我想要实现的与 Windows 和 C# 中的相同:

Process.Start("http://localhost:4001")

使用它,您的默认浏览器的新实例将启动并显示 URL

4

7 回答 7

15

"http://localhost:4001/"是一个 URL,它不能被执行,但是你可以执行一个 Web 浏览器(例如firefox)并将 URL 作为第一个参数传递。

在 Windows、OS X 和 Linux 上存在可用于启动默认 Web 浏览器的帮助程序。我想 FreeBSD 和 Android 也有类似的事情,但我不确定。以下代码段应该适用于 Windows、OS X 和大多数 Linux 发行版:

var err error
switch runtime.GOOS {
case "linux":
    err = exec.Command("xdg-open", "http://localhost:4001/").Start()
case "windows", "darwin":
    err = exec.Command("open", "http://localhost:4001/").Start()
default:
    err = fmt.Errorf("unsupported platform")
}
于 2012-04-30T08:53:27.447 回答
6

在 Windows 下使用:

exec.Command("cmd", "/c", "start", "http://localhost:4001/").Start()
于 2013-05-20T06:36:31.660 回答
3

使用

exec.Command("open", "http://localhost:4001/").Start()

在上面 tux21b 的回答中,在 Windows 上对我不起作用。然而,这样做:

exec.Command(`C:\Windows\System32\rundll32.exe`, "url.dll,FileProtocolHandler", "http://localhost:4001/").Start()
于 2012-09-21T19:40:59.417 回答
2

https://github.com/golang/go/blob/33ed35647520f2162c2fed1b0e5f19cec2c65de3/src/cmd/internal/browser/browser.go

// Commands returns a list of possible commands to use to open a url.
func Commands() [][]string {
    var cmds [][]string
    if exe := os.Getenv("BROWSER"); exe != "" {
        cmds = append(cmds, []string{exe})
    }
    switch runtime.GOOS {
    case "darwin":
        cmds = append(cmds, []string{"/usr/bin/open"})
    case "windows":
        cmds = append(cmds, []string{"cmd", "/c", "start"})
    default:
        cmds = append(cmds, []string{"xdg-open"})
    }
    cmds = append(cmds, []string{"chrome"}, []string{"google-chrome"}, []string{"firefox"})
    return cmds
}

// Open tries to open url in a browser and reports whether it succeeded.
func Open(url string) bool {
    for _, args := range Commands() {
        cmd := exec.Command(args[0], append(args[1:], url)...)
        if cmd.Start() == nil {
            return true
        }
    }
    return false
}
于 2016-09-29T22:08:24.057 回答
1

"http://localhost:4001"不是一个进程,也不是可执行文件,......它只是一个 URL。

您似乎正在尝试获取 URL。如果是这样,请考虑使用net/http

于 2012-04-30T02:35:52.377 回答
0

对于 Windows,创建如下文件:

//go:generate mkwinsyscall -output zweb.go web.go
//sys shellExecute(window int, verb string, file string, arg string, dir string, showCmd int) (err error) = shell32.ShellExecuteW
package main
const sw_shownormal = 1

func main() {
   shellExecute(0, "", "https://stackoverflow.com", "", "", sw_shownormal)
}

然后构建:

go mod init web
go generate
go mod tidy
go build

https://pkg.go.dev/golang.org/x/sys/windows/mkwinsyscall

于 2021-01-15T02:48:37.603 回答
-1

起初,我喜欢@tux21b 提供的答案。但是这段代码有一个微妙的问题:用于选择平台特定代码的条件逻辑将嵌入到目标可执行二进制文件中。这意味着,逻辑将出现在“windows”、“linux”、“darwin”或任何目标平台中。在这个特定示例中,每个平台的代码只有一行。但是想象一下,当每个平台的代码超过 100 行时会发生什么?目标可执行文件将急剧增长。因此,与其为每个可能的平台都包含代码,不如在构建时只包含正确的代码。实际上 Go 支持称为build tags的功能,它可以对特定于平台的代码进行更细粒度的控制。

例如,如果文件包含此注释(在包声明之前):

// +build linux darwin

go build 只会在为 Linux 或 Mac OS X 构建时编译它。这意味着目标可执行文件将不包含外星平台的代码。

open-golang包提供了有问题的功能,但要考虑构建标签

于 2016-11-23T08:10:33.667 回答