0

我正在尝试为 map[] 类型制作一个包装器,以便我可以添加一些方法,例如 contains() (这几乎让我想念 java)。但是,我不知道如何在 java 中做任何类似泛型的事情。

虽然我读过的几乎所有内容都说 golang 没有泛型类型,但肯定有比为我正在使用的每个可能的结构和值组合编写单独的结构更好的方法。

这就是我正在尝试做的事情,即使代码不起作用:

func newMap(key interface{}, val interface{}) {
    keytype := key.(type)
    valtype := val.(type)

    return hashmap{map[keytype]valtype}
}

type hashmap struct {
    hashmap     map[]
}

任何有关如何执行此操作的帮助/解释将不胜感激。

编辑:包含不是我想要复制的唯一东西,因此希望制作一个“通用”哈希图。replace(),isEmpty(),还有所有有趣的东西。

4

2 回答 2

2

正如您所说,Golang 没有泛型。

但是可以使用您自己的类型声明映射,因此您不一定需要编写自己的“通用”哈希映射来使用“包含”或“为空”之类的东西。

示例(假设已经存在一些 Icon 和 Color 类型,以及GetTheIcon返回一些图标的函数):

// this one will map Icon -> Colour
iconToColours := make(map[Icon]Colour)

myIcon := GetTheIcon()
// second return argument is true if the key was found in the map
_, iconIsContained := iconToColours[myIcon]

// check if the map is empty
isEmpty := (len(iconToColours) == 0)

在这里查看更多:

https://blog.golang.org/go-maps-in-action

于 2018-06-04T18:58:53.040 回答
-2

要为地图创建类似 contains 的函数,您不需要泛型。Go 可以很好地处理这个问题,有更多的方法可以做到这一点,根据用例,一些方法可以有更好的性能。例如,您可以考虑编写一个哈希码函数

但还有更多需要考虑的事情。

在 Java 中,泛型只是代码糖。在运行时,Java 中的地图或列表具有与 Golang 中相同的功能。在地图动作中变得可见的对象将具有属于该对象的特征。这在 Java 和 Golang 中是一样的。所以在 golang 中你没有语法糖,所以你必须记住自己可以在地图、列表等中预期哪些对象。

在此处阅读有关 Java 中的语法糖的信息。它将帮助你接受围棋设计师所做的选择。

https://www.cordinc.com/blog/2010/09/java-generics-are-not-real-gen.html

于 2018-06-04T20:23:43.730 回答