Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass []string to a function that expects a variadic parameter

Tags:

go

In order to don't repeat my self over and over I wanted to create a function that handles running some commands.

func runCommand(name string, arg ...string) error {
    cmd := exec.Command(name, arg)
    if err := cmd.Run(); err != nil {
        return err
    } else {
        return nil
    }
}

Once I try to run this I get the following error:

cannot use arg (type []string) as type string in argument to exec.Command

I had a look into the implementation of the os.Command and it looks that the function signature is exact what I supply.

Internally a []string should be the same as variadic parameter but for the compiler it seems not.

Is there a way to pass the variadic parameter into the Command?

like image 421
Mark Avatar asked Dec 01 '22 14:12

Mark


1 Answers

You expand the []string with another ...

cmd := exec.Command(name, arg...)

From the language spec on Passing arguments to ... parameters

If the final argument is assignable to a slice type []T, it may be passed unchanged as the value for a ...T parameter if the argument is followed by .... In this case no new slice is created.

Given the slice s and call

s := []string{"James", "Jasmine"}
Greeting("goodbye:", s...)

within Greeting, who will have the same value as s with the same underlying array.

like image 52
JimB Avatar answered Dec 16 '22 04:12

JimB