前言
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{
//不存在
}
参考文档: