Golang - [...] 接口的总和{}
Golang - Sum of an [...]interface{}
我创建了一个通用数据结构,在 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 {})
编译中。
有谁知道如何添加泛型类型,因为我们知道它们是数字的?
谢谢!
+
运算符未在 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
个数字,没有别的。如果你想 "support" 多个数字类型,更方便的方法是使用 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.
上试试这个
我创建了一个通用数据结构,在 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 {})
编译中。
有谁知道如何添加泛型类型,因为我们知道它们是数字的?
谢谢!
+
运算符未在 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
个数字,没有别的。如果你想 "support" 多个数字类型,更方便的方法是使用 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.
上试试这个