9

Webブラウザを開きたい:

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」などのターゲットプラットフォームに存在します。この特定の例では、コードはプラットフォームごとに1行だけです。しかし、想像してみてください。コードがプラットフォームごとに100行以上になるとどうなるでしょうか。ターゲットの実行可能ファイルは劇的に大きくなります。したがって、考えられるすべてのプラットフォームのコードを含めるのではなく、ビルド時に適切なコードを含める方が適切です。実際、Goはビルドタグと呼ばれる機能をサポートしています。これにより、プラットフォーム固有のコードをよりきめ細かく制御できます。

たとえば、ファイルにこのコメントが含まれている場合(パッケージ宣言の前):

// +build linux darwin

go buildは、LinuxまたはMac OS X用にビルドする場合にのみコンパイルします。つまり、ターゲットの実行可能ファイルには、エイリアンプラットフォーム用のコードは含まれません。

open-golangパッケージは問題の機能を提供しますが、ビルドタグを念頭に置いています!

于 2016-11-23T08:10:33.667 に答える