首页 > 解决方案 > Go2 从一种类型映射到另一种类型

问题描述

在Go 泛型提案的这个示例中,该Mapable类型只有一个类型参数。

如何修改示例以允许从一种类型映射到另一种类型?

例如,如何重写 Map 方法以允许从intto映射float64?我尝试将表达式[Y any]放在声明中的不同位置 for Map,但没有一个通过语法检查器。

标签: gogenericsmapping

解决方案


我在这里看到的棘手的事情是,当您执行映射操作时,您期望结果也将是Mapable. 因此,如果您将 type 数组映射到 typeT数组K,您必须选择结果可映射到什么。回T? 还是只对自己?还是第三类?(在这种情况下,您必须再添加一个类型参数)。

首先,Mapablestruct 必须接受两个类型参数——输入数组的类型和结果数组的类型。所以它应该看起来像这样:

type Mapable[T, K any] struct {
    Arr []T
}

现在Map函数不接受函数T -> T,但是T -> K

func (m Mapable[T, K]) Map(fn func(T) K) Mapable[K, K] {
    var newCol []K
    for _, item := range m.Arr {
        newCol = append(newCol, fn(item))
    }
    return NewMapable[K, K](newCol)
}

现在,为了简单起见,我选择返回类型为Mapable[K, K],即。结果Mapable只能映射到相同的类型,但您可以选择返回Mapable[K, T]以便Mapable可以“映射回”到第一种类型。

无论如何,这是带有新代码的游乐场:https ://go2goplay.golang.org/p/OxOwaaL16AX

这是我旁边的代码,以便更好地了解更改的内容:https ://www.textcompare.org/index.html?id=5f6df344fa7b900017d8d157


推荐阅读