I'm writing some code, and I need it to catch the arguments and pass them through fmt.Println
(I want its default behaviour, to write arguments separated by spaces and followed by a newline). However it takes []interface {}
but flag.Args()
returns a []string
.
Here's the code example:
package main
import (
"fmt"
"flag"
)
func main() {
flag.Parse()
fmt.Println(flag.Args()...)
}
This returns the following error:
./example.go:10: cannot use args (type []string) as type []interface {} in function argument
Is this a bug? Shouldn't fmt.Println
take any array? By the way, I've also tried to do this:
var args = []interface{}(flag.Args())
but I get the following error:
cannot convert flag.Args() (type []string) to type []interface {}
Is there a "Go" way to workaround this?
Best Answer
This is not a bug.
fmt.Println()
requires a[]interface{}
type. That means, it must be a slice ofinterface{}
values and not "any slice". In order to convert the slice, you will need to loop over and copy each element.The reason you can't use any slice is that conversion between a
[]string
and a[]interface{}
requires the memory layout to be changed and happens in O(n) time. Converting a type to aninterface{}
requires O(1) time. If they made this for loop unnecessary, the compiler would still need to insert it.