スライスを可変個引数入力として渡すにはどうすればよいですか?


89

関数がありますfunc more(... t)。スライスを使用して引数のリストを作成することは可能かどうか疑問に思っています...

私は次のプログラムを解決しようとしています。基本的に、コマンドを文字列として受け取る通常のシェルを模倣します。 コマンド関数には引数の「リスト」が必要ですが、文字列をそのようなリストに変換する方法がわかりません

    import "os/exec"
    import "strings"
    func main(){
        plainCommand  := "echo hello world"
        sliceA := strings.Fields(plainCommand)
        cmd := exec.Command(sliceA)
    }

回答:


103

Goプログラミング言語仕様

...パラメータに引数を渡す

fが最終パラメーター型... Tの可変個引数である場合、関数内の引数は型[] Tのパラメーターと同等です。fを呼び出すたびに、最後のパラメーターに渡される引数は、タイプ[] Tの新しいスライスであり、その連続する要素は実際の引数であり、すべてタイプTに割り当てる必要があります。したがって、スライスの長さは、引数はfinalパラメータにバインドされており、呼び出しサイトごとに異なる場合があります。


パッケージexec

funcコマンド

func Command(name string, arg ...string) *Cmd

コマンドはCmd構造体を返し、指定された引数を使用して名前付きプログラムを実行します。

返されるCmdのArgsフィールドは、コマンド名とそれに続くargの要素で構成されているため、argにコマンド名自体を含めることはできません。たとえば、Command( "echo"、 "hello")


例えば、

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    name := "echo"
    args := []string{"hello", "world"}
    cmd := exec.Command(name, args...)
    out, err := cmd.Output()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(out))
}

出力:

hello world

11

コマンド引数のリストは、フラグパッケージArgs()関数から取得できます。次に、可変個引数入力スタイル(func(input...))を使用してこれを関数に渡すことができます。

仕様から:

fが最終パラメーター型... Tの可変個引数である場合、関数内の引数は型[] Tのパラメーターと同等です。fを呼び出すたびに、最後のパラメーターに渡される引数は、タイプ[] Tの新しいスライスであり、その連続する要素は実際の引数であり、すべてタイプTに割り当てる必要があります。

例:

package main

import "fmt"

func echo(strings ...string) {
    for _, s := range strings {
        fmt.Println(s)
    }
}

func main() {
    strings := []string{"a", "b", "c"}
    echo(strings...) // Treat input to function as variadic
}

詳細については、Goの仕様を参照してください。

遊び場


6

funcコマンド

func Command(name string, arg ...string) *Cmd

コマンドはCmd構造体を返し、指定された引数を使用して名前付きプログラムを実行します。

したがって、で見つかったコマンドを抽出してからsliceA[0]、可変個引数を使用してすべての引数を渡す必要がありますが、コマンドは削除しsliceA[1:]...ます。

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA[0], sliceA[1:]...)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.