As we Know,php的函数库非常强大。大部分的业务场景我们不需要重复造轮子,这个东西吧,有好有坏吧。好处不必说,开发更便捷,底层c实现,效率更高。坏处就是...使用的时候是知其然,不知其所以然。。。废话少说。来几个对比php的golang函数,练练手。
正文1.元素是否存在一个切片中
判断一个元素有没有在数组中,php使用in_array()函数,那么在golang中,如何判断元素是否存在一个切片中呢?
go go go,搞一个 []string 类型的切片:
import (
"strconv"
)
func InSlice(value interface{}, list []string) bool {
switch value.(type) {
case int:
value = strconv.Itoa(value.(int)) // value.(int)表示断言:value是一个int
case uint:
value = strconv.Itoa(int(value.(uint))) // int(type)表示强类型转换:将uint转为int
case float64:
value = strconv.FormatFloat(value.(float64), 'f', -1, 64) // 将float64转为string
case float32:
value = strconv.FormatFloat(float64(value.(float32)), 'f', -1, 32) // 将float32先转为float64再转为string
}
for _, el := range list {
if el == value {
return true
}
}
return false
}
2.去除切片中的空值
这代码真的没啥好讲的,炒鸡简单,我就是无聊摸摸鱼。。。。
func FilterSlice(list []string) (result []string) {
for _, value := range list {
if value != "" {
result = append(result, value)
}
}
return
}
3. 去除切片中的重复值
如果有需要一丢丢的说明,都在代码注释里。
func UniqueSlice(list []string) (result []string) {
// 存储每个元素的数量
countEle := make(map[string]int)
for _, value := range list {
countEle[value] += 1
if countEle[value] > 1 {
continue
}
result = append(result, value)
}
return
}
4. 将多个同类型切片合并成一个切片
用到一个可变变量,没啥说的。
func MergeSlice(list ...[]string) (result []string) {
for _, value := range list {
for _, v := range value {
result = append(result, v)
}
}
return
}
5.将多个map合并成一个map
这个也没啥说的,和切片的合并一样。如果合并的map中键有重复,则后面的键值会覆盖前面的。小白需要注意的是,map使用前需要初始化。
另外,如果方法要传固定参数,固定参数需要放到可变参数前面。
func MergeMap(mapList ...map[string]string) map[string]string {
result := make(map[string]string)
for _, value := range mapList {
for k, v := range value {
result[k] = v
}
}
return result
}
还是废话
还有啥?如果有比较好用的、复杂的方法,请留言。我把它加上。
后面如果我有想到需要加的我再加。。。。
对了, 这篇博客只是针对php的array相关函数,用golang实现一下。其他的类型,后面的博客见~