HiveBrain v1.2.0
Get Started
← Back to all entries
debuggoCritical

Cannot convert []string to []interface {}

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
cannotstringconvertinterface

Problem

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?

Solution

This is not a bug. 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.