1. ホーム
  2. go

[解決済み] スライスを変数入力として渡すには?

2022-09-20 21:55:51

質問

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

私は以下のプログラムを解こうとしています。基本的には、文字列としてコマンドを受け取る通常のシェルを模倣することです。 コマンド 関数は、引数の"リスト"を必要とし、私はそのようなリストに文字列を変換することができますどのように表示されません。

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

どのように解決するのですか?

<ブロッククオート

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

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

fが最終パラメータ型...Tを持つvariadicである場合、関数内では 関数内では、引数は[]T型のパラメータと同じです。fの各呼び出しで fの各呼び出しで、最終パラメータに渡される引数は新しい 型[]Tのスライスで,その連続する要素が実際の引数です. その連続する要素は実際の引数であり、それらはすべて型Tに代入可能でなければなりません。スライスの長さは したがって、スライスの長さは最終パラメータに束縛される引数の数であり 各コールサイトごとに異なる場合があります。


<ブロッククオート

パッケージの実行

func コマンド

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

コマンドは、指定された引数で指定されたプログラムを実行するためのCmd構造体を返す。 を返す。

返されたCmdのArgsフィールドは、コマンド名とargの要素から構成されます。 の後に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