golang交集,差集

从今天起写一些golang 函数实现PHP库函数的功能

PHP 函数 array_diff,array_intersect

package php

//ArrayDiff 模拟PHP array_diff函数
func ArrayDiff(array1 []interface{}, othersParams ...[]interface{}) ([]interface{}, error) {
	if len(array1) == 0 {
		return []interface{}{}, nil
	}
	if len(array1) > 0 && len(othersParams) == 0 {
		return array1, nil
	}
	var tmp = make(map[interface{}]int, len(array1))
	for _, v := range array1 {
		tmp[v] = 1
	}
	for _, param := range othersParams {
		for _, arg := range param {
			if tmp[arg] != 0 {
				tmp[arg]++
			}
		}
	}
	var res = make([]interface{}, 0, len(tmp))
	for k, v := range tmp {
		if v == 1 {
			res = append(res, k)
		}
	}
	return res, nil
}

//ArrayIntersect 模拟PHP array_intersect函数
func ArrayIntersect(array1 []interface{}, othersParams ...[]interface{}) ([]interface{}, error) {
	if len(array1) == 0 {
		return []interface{}{}, nil
	}
	if len(array1) > 0 && len(othersParams) == 0 {
		return array1, nil
	}
	var tmp = make(map[interface{}]int, len(array1))
	for _, v := range array1 {
		tmp[v] = 1
	}
	for _, param := range othersParams {
		for _, arg := range param {
			if tmp[arg] != 0 {
				tmp[arg]++
			}
		}
	}
	var res = make([]interface{}, 0, len(tmp))
	for k, v := range tmp {
		if v > 1 {
			res = append(res, k)
		}
	}
	return res, nil
}

测试测试

	var sl2 = []interface{}{7, 8, 9, 10, "ff"}

	var sl3 = []interface{}{"sds", "dddd", "ff", "yy"}
  
	res, err := php.ArrayIntersect(sl2, sl3)
	if err == nil {
		fmt.Println(res)
	} else {
		fmt.Println(err)
	}

注意点

由于参数是interface{}没有对一些无法比较的类型进行校验,使用函数时应该注意参数类型为可比较类型 

golang 下可比较类型

可比较类型 不可比较类型
boolean slice
numeric map
string func
pointer  
channel  
interface  
包含前文类型的array和struct

猜你喜欢

转载自blog.csdn.net/u011000175/article/details/108443666