[go] 슬라이스를 가변 입력으로 어떻게 전달할 수 있습니까?

나는 기능이 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로 가변적이면 함수 내에서 인수는 [] T 유형의 매개 변수와 동일합니다. f를 호출 할 때마다 최종 매개 변수에 전달되는 인수는 연속 요소가 실제 인수 인 [] T 유형의 새 슬라이스이며, 모두 T 유형에 할당 할 수 있어야합니다. 따라서 슬라이스의 길이는 인수는 최종 매개 변수에 바인딩되며 호출 사이트마다 다를 수 있습니다.


패키지 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


답변

명령 인수 목록은 플래그 패키지 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 사양 을 참조하세요.

운동장


답변

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:]...)
}


답변