debuggoCritical
Cannot convert []string to []interface {}
Viewed 0 times
cannotstringconvertinterface
Problem
I'm writing some code, and I need it to catch the arguments and pass them through
(I want its default behaviour, to write arguments separated by spaces and followed by a newline). However it takes
Here's the code example:
This returns the following error:
Is this a bug? Shouldn't
but I get the following error:
Is there a "Go" way to workaround this?
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 argumentIs 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?
Solution
This is not a bug.
The reason you can't use any slice is that conversion between a
fmt.Println() requires a []interface{} type. That means, it must be a slice of interface{} values and not "any slice". In order to convert the slice, you will need to loop over and copy each element.old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
new[i] = v
}
fmt.Println(new...)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 an interface{} requires O(1) time. If they made this for loop unnecessary, the compiler would still need to insert it.Code Snippets
old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
new[i] = v
}
fmt.Println(new...)Context
Stack Overflow Q#12990338, score: 142
Revisions (0)
No revisions yet.