【问题标题】:Golang - Sum of an [...]interface{}Golang - [...] 接口的总和{}
【发布时间】:2019-07-20 22:24:57
【问题描述】:

我创建了一个通用数据结构,在 Golang 中有一个名称和一个通用数组。

package main

import "fmt"

type NamedArray struct {
  Name string
  values []interface{}
}

func main() {
  data := [...]int{1, 2, 3, 4, 5}
  interfaced_data := make([]interface{}, len(data))
  for i, v := range data{
    interfaced_data[i] = v
  }
  int_arr := NamedArray{Name: "Int Array", values: interfaced_data}
  fmt.Println(int_arr)
  // fmt.Println(int_arr.Sum()) -- uncomment to run Sum

  data_float := [...]float64{0.1, 0.2, 0.3, 0.4, 0.5}
  interfaced_data_float := make([]interface{}, len(data_float))
  for i, v := range data_float{
    interfaced_data_float[i] = v
  }
  float_arr := NamedArray{Name: "Float Array", values: interfaced_data_float}
  fmt.Println(float_arr)
  // fmt.Println(int_arr.Sum()) -- uncomment to run Sum
}

现在我想定义一个方法,它允许我对数组中的所有值求和。我知道它们是数字的(尽管它们是 int 还是 float 取决于上下文)但我遇到了一些严重的问题。

func (arr NamedArray) Sum() interface{} {
  data := arr.values
  sum := 0
  for i, v := range data {
    sum += v
  }
  return sum
}

不过,我似乎无法完成这项工作。当我取消注释第 18 和 27 行(fmt.Println(int_arr.Sum()fmt.Println(int_arr.Sum())并尝试运行我得到的代码时

34:9: invalid operation: sum += v (mismatched types int and interface {})

编译期间。

有谁知道如何添加泛型类型,因为我们知道它们是数字的?

谢谢!

【问题讨论】:

  • 您必须检查实际类型并分别处理不同的情况。请注意,Go 中有很多数字类型需要考虑很多情况。

标签: go types interface type-assertion


【解决方案1】:

+ 运算符未在 interface{} 类型的值上定义。您必须先从 interface{} 值中获取类型为 int 的值,然后才能将其用作数字。

为此,您可以使用type assertion。看这个例子:

s := []interface{}{1, 2, 3, "invalid"}

sum := 0
for _, v := range s {
    if i, ok := v.(int); ok {
        sum += i
    } else {
        fmt.Println("Not int:", v)
    }
}
fmt.Println("Sum:", sum)

输出(在Go Playground上试试):

Not int: invalid
Sum: 6

上面的例子只处理int 数字,没有别的。如果你想“支持”多种数字类型,更方便的方法是使用type switch

s := []interface{}{1, int32(2), int8(3), "invalid"}

sum := 0
for _, v := range s {
    switch i := v.(type) {
    case int:
        sum += i
    case int32:
        sum += int(i)
    case int8:
        sum += int(i)
    default:
        fmt.Println("Not int:", v)
    }
}
fmt.Println("Sum:", sum)

输出是一样的。在Go Playground 上试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2020-05-15
    • 2015-06-11
    • 2017-05-17
    相关资源
    最近更新 更多