从今天起写一些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 |