1

How to sum an array of integers with mixed types of strings and numbers in GoLang? Code below errors with "mismatched types int and any" and "cannot initialize 1 variables with 2 values".

Is there something like this JavaScript solution? Function that sums array numbers (including numbers as strings)

errored code:

import (
"fmt"
"strconv"
)

func main() {
  fmt.Println(sum([]any{9, 1, "8", "2"})) // this should output 20
}

func sum(arr []any) int {
  n:=0
  for _, v := range arr{
    temp:=strconv.Atoi(v) //err: cannot initialize 1 variables with 2 values
    n+=temp //err: mismatched types int and any
  }
  return n
}

This also errors:

  n:=0
  for _, v := range arr{
    temp:=0
    if reflect.TypeOf(v)=="string"{
      temp=strconv.Atoi(v)
    } else {
      temp=v
    }
    n+=temp
  }
  return n
MoKi
  • 157
  • 1
  • 2
  • 15

1 Answers1

4

count+=temp //err: mismatched types int and any

Use a type switch to handle integer and string values as appropriate.

temp:=strconv.Atoi(v) //err: cannot initialize 1 variables with 2 values

strconv.Atoi returns two values. Assign the result to two variables. Handle the error return.

Here's the code with the fixes:

func sum(arr []any) int {
    n := 0
    for _, v := range arr {
        switch v := v.(type) {
        case int:
            n += v
        case string:
            i, err := strconv.Atoi(v)
            if err != nil {
                panic(err)
            }
            n += i
        default:
            panic(fmt.Sprintf("unsupported type %T", v))
        }
    }
    return n
}

For completeness, here's a version of the function that uses reflection. The type switch version of the function is preferred over reflection.

func sum(arr []any) int {
    n := 0
    for _, v := range arr {
        v := reflect.ValueOf(v)
        if v.Kind() == reflect.Int {
            n += int(v.Int())
        } else if v.Kind() == reflect.String {
            i, err := strconv.Atoi(v.String())
            if err != nil {
                panic(err)
            }
            n += i
        } else {
            panic(fmt.Sprintf("unsupported type %s", v.Type()))
        }
    }
    return n
}
Bad Penny
  • 41
  • 2