我正在尝试编写函数Map
,以便它可以处理所有类型的数组。
// Interface to specify generic type of array.
type Iterable interface {
}
func main() {
list_1 := []int{1, 2, 3, 4}
list_2 := []uint8{'a', 'b', 'c', 'd'}
Map(list_1)
Map(list_2)
}
// This function prints the every element for
// all []types of array.
func Map(list Iterable) {
for _, value := range list {
fmt.Print(value)
}
}
但它会抛出编译时错误。
19: cannot range over list (type Iterable)
错误是正确的,因为range
需要数组,指向数组的指针,切片,字符串,映射或允许接收操作的通道,此处类型为Iterable
。我认为我面临的问题是,将参数类型Iterable
转换为数组类型。请建议,我如何使用我的函数来处理通用数组。
答案 0 :(得分:5)
正如Rob Pike在this thread
中提到的那样是否可以表达任何地图","任何阵列"或者"任何切片"在Go类型开关?
没有。 静态类型必须准确 空接口实际上是一种类型,而不是通配符。
您只能迭代特定类型的列表,例如具有已知功能的接口 您可以使用" Can we write a generic array/slice deduplication in go?"
查看示例即使使用反射,将interface{}
作为this thread shows传递一个切片,也可能是this example,容易出错(请参阅{{3}})。
答案 1 :(得分:0)
您对地图的定义有些不完整。通常的方式来声明它会有mapper方法。 您的示例至少可以通过这种方式实现
package main
import "fmt"
// Interface to specify something thet can be mapped.
type Mapable interface {
}
func main() {
list_1 := []int{1, 2, 3, 4}
list_2 := []string{"a", "b", "c", "d"}
Map(print, list_1)
Map(print, list_2)
}
func print(value Mapable){
fmt.Print(value)
}
// This function maps the every element for
// all []types of array.
func Map(mapper func(Mapable), list ... Mapable) {
for _, value := range list {
mapper(value)
}
}
works。需要说它有点无关紧要。因为不,Go在Hindley-Milner sence中没有“仿制药”