猿问

Golang - [...] 接口的总和{}

我在 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 {})

在编译期间。


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


谢谢!


皈依舞
浏览 143回答 1
1回答

撒科打诨

运算+符未在 type 的值上定义interface{}。int您必须先从值中获取类型值,interface{}然后才能将其作为数字使用。为此,您可以使用类型断言。看这个例子:s := []interface{}{1, 2, 3, "invalid"}sum := 0for _, 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数字,没有别的。如果你想“支持”多种数字类型,更方便的方法是使用类型开关:s := []interface{}{1, int32(2), int8(3), "invalid"}sum := 0for _, 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试试这个。
随时随地看视频慕课网APP

相关分类

Go
我要回答