当前位置: 首页 > 科技观察

Go泛型系列:Maps包中有什么?

时间:2023-03-21 21:50:10 科技观察

https://github.com/golang/exp/blob/master/maps/maps.go01现实场景中很多新手都对地图的随机输出感到困惑。以前地图的输出顺序是固定的,但是官方怕大家依赖这个顺序,然后故意让输出顺序不固定。但是在实际场景中,会需要按照一定的顺序输出地图。我应该怎么办?这需要对地图的键进行排序。伪代码如下:fork:=m{keys=append(keys,k)}sort(keys)类似的代码会经常需要写,重点是,因为没有泛型,我们还是写不出来重用代码的通用功能。02maps包详解目前maps包有8个函数:funcKeys[M~map[K]V,Kcomparable,Vany](mM)[]KfuncValues[M~map[K]V,Kcomparable,Vany](mM)[]VfuncEqual[M1,M2~map[K]V,K,Vcomparable](m1M1,m2M2)boolfuncEqualFunc[M1~map[K]V1,M2~map[K]V2,Kcomparable,V1,V2any](m1M1,m2M2,eqfunc(V1,V2)bool)boolfuncClear[M~map[K]V,Kcomparable,Vany](mM)funcClone[M~map[K]V,Kcomparable,Vany](mM)MfuncCopy[M~map[K]V,Kcomparable,Vany](dst,srcM)funcDeleteFunc[M~map[K]V,Kcomparable,Vany](mM,delfunc(K,V)bool)其中Keys就是上面提到的场景,提取所有的key形成一个slice,方便排序。对应的,Values函数就是获取所有的值,组成一个切片。funcKeys[M~map[K]V,Kcomparable,Vany](mM)[]K{r:=make([]K,0,len(m))fork:=rangem{r=append(r,k)}returnr}注意类型约束:~map[K]V,表示只要底层类型是map就适用,即适用于自定义地图类型。上面函数的类型约束也说明了在map中,key必须是comparable的,即comparable,value可以是任意类型,即any。Equal和EqualFunc用于比较两个map是否有相同的键值对,不宜多用。至于Clone和Copy,Clone是用来克隆一个新的map,key和value和原来的一样,但不是深度克隆,也就是说value可能指向同一个。而Copy可以将src中的所有key/value复制到dst中,如果dst中存在相同的key,则覆盖掉。Clear和DeleteFunc用于删除映射的键值对。地图包代码不到100行,实现非常简单易懂。但是,大家需要仔细理解函数签名,因为泛型的引入使得函数签名比之前的函数签名复杂了很多。03总结PHPer可能不当回事:PHP一直都有这些东西,Go越来越多PHP。..之前Go没有提供相关功能,主要是没有泛型,无法提供通用功能。使用泛型,可以编写泛型代码,所以提供相关的便利函数。大家对maps包有什么建议,以后可以试试,给点建议。毕竟它只是在exp包中,并没有被正式纳入标准库。