MoKi
MoKi

Reputation: 328

Golang: how to sum an array of integers as strings and numbers

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

Upvotes: 2

Views: 4342

Answers (1)

Bad Penny
Bad Penny

Reputation: 41

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
}

Upvotes: 4

Related Questions