废话

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实现一下。其他的类型,后面的博客见~