Afro Jacky
Afro Jacky

Reputation: 51

How to make variable type slices

I was learning go by doing some of the problems I have already completed in other languages.

So one of the problem was:-

I have tried making an interface type array but that also didn't work

func ProdSum(prods interface{},sum int ,depth int){
    for id,val:=range prods{
        if isArray(val){    
                ProdSum(val,sum,depth)
        }
    }

}
type arr []interface{}
func main(){
    arra:=arr{5,2,arr{7,-1},3,arr{6,arr{-13,8},4}}
    ProdSum(arra,0,1)
}
Error :

./prodsum.go:16:14: cannot range over prods (type interface {})

Upvotes: 0

Views: 62

Answers (2)

Thundercat
Thundercat

Reputation: 121059

Use a type assertion or type switch to determine if a value is a slice or an integer. Here's how to do it using a type switch:

func sum(value interface{}) int {
    switch value := value.(type) {
    case arr:
        var result int
        for _, v := range value {
            result += sum(v)
        }
        return result
    case int:
        return value
    default:
        panic("type not handled")
    }
}

Call it like this:

a := arr{5, 2, arr{7, -1}, 3, arr{6, arr{-13, 8}, 4}}
n := sum(a)

Run it on the playground.

Upvotes: 5

phonaputer
phonaputer

Reputation: 1530

The way you are declaring and initializing the array is correct, although you don't need the arr type.

Without the arr type it will look like this:

Running in Go Playground

myArr := []interface{}{1, 2, []int{7, 8, 3}, 1, []interface{}{3, []interface{}{2, []int{4, 5}}, 6}}

Now, the specific error you are seeing is not related to your slice declaration. It is related to the function signature of ProdSum.

ProdSum takes an argument of type interface{}- which is not a slice so you cannot iterate over it. You want the argument to have a type of []interface{} (slice of empty interface):

func ProdSum(prods []interface{}, sum int, depth int) {
    for itr, prod := range prods {
         // prod has type: interface{}
    }
}

Keep in mind that you will need to do type assertions when reading the values out of the slice and summing them. You can't add an interface{} to anything because (before an assertion to int) Go doesn't recognize it as a number.

Upvotes: 3

Related Questions