为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
皈依舞 2023-06-12 15:18:59
我在 Golang 中创建了一个通用数据结构,其中包含一个名称和一个通用数组。package mainimport "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 {})在编译期间。有谁知道如何添加泛型类型,因为我们知道它们是数字的?谢谢!
查看完整描述

1 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

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

为此,您可以使用类型断言。看这个例子:

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数字,没有别的。如果你想“支持”多种数字类型,更方便的方法是使用类型开关:

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试试这个。



查看完整回答
反对 回复 2023-06-12
  • 1 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信