golang 实现类似in_array的功能

前言

php里面有个函数叫in_array(search,arr),用来判断某个值是否存在特定一维索引数组中。

golang如何实现?

正文

因为golang是强类型语言,所以真的要覆盖参数是多类型的in_array,代码就有点多,毕竟现在1.15的版本还没支持泛型。

但是web开发,元素一般都是字符串的判断。

下面以元素为字符串类型进行举例,实现类似in_array的效果,实际上是没有遍历整个数组,而是使用map通过key来查找,达到以空间换时间的目的!

上代码:

            var allowedArr map[string]struct{} = map[string]struct{}{
        		"version": struct {}{},
        		"algorithm": struct {}{},
        		"start_time": struct {}{},
        		"end_time": struct {}{},
        		"issuer": struct {}{},
        		"NewKeyHash": struct {}{},
        		"CertMd5": struct {}{},
        		"pubkeycontent": struct {}{},
        		"serialnum": struct {}{},
			}

            newSingle := make(map[string]interface{})

			newSingle["cert_list.version"]=""
			newSingle["cert_list.algorithm"]=""
			newSingle["cert_list.start_time"]=""
			newSingle["cert_list.end_time"]=""
			newSingle["cert_list.issuer"]=""
			newSingle["cert_list.NewKeyHash"]=""
			newSingle["cert_list.CertMd5"]=""
			newSingle["cert_list.pubkeycontent"]=""
			newSingle["cert_list.serialnum"]=""

            //certMap的键是动态的,当然是在一个集合里动态;现在针对满足allowedArr ,且值不为nil的就覆盖空字符串
			for k,v:= range certMap {
				if _,ok:=allowedArr[k];ok{
					tempKey:="cert_list."+k
					if _, ok := certMap[k]; ok  && certMap[k]!=nil{
						//存在
						newSingle[tempKey]= v
					}
				}
			}

涉及额外两个知识点:

1.设置map的 value 为空结构体struct{}{},在 Go 中,空结构体不占任何内存。当然,如果不确定,也可以来证明下这个结论。

unsafe.Sizeof(struct{}{}) // 结果为 0

2.判断map中某个key是否存在:

if _, ok := map[key]; ok {
    //存在
}else{
    //不存在
}

参考文档:

https://zhuanlan.zhihu.com/p/67580188

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值