51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package helper
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func ArrDeduplication[T int | int32 | uint32 | uint64 | int64 | int8 | string](arr []T) []T {
|
|
seen := map[T]bool{}
|
|
var result []T
|
|
for _, num := range arr {
|
|
if !seen[num] {
|
|
seen[num] = true
|
|
result = append(result, num)
|
|
}
|
|
}
|
|
return result
|
|
}
|
|
|
|
// BuildStr 函数用于将 uid 和 arr 中的元素拼接成一个字符串
|
|
func BuildStr[T int | int32 | uint32 | uint64 | int64 | int8 | string](uid string, arr []T) string {
|
|
// 创建一个 strings.Builder 实例,用于高效地构建字符串
|
|
var sb strings.Builder
|
|
|
|
// 写入初始的 uid
|
|
sb.WriteString(uid)
|
|
|
|
// 遍历 arr 切片中的每个元素
|
|
for i, id := range arr {
|
|
// 如果不是第一个元素,先写入下划线分隔符
|
|
if i > 0 {
|
|
sb.WriteByte('_')
|
|
} else if sb.Len() > 0 {
|
|
// 如果 uid 不为空且是第一个元素,也写入下划线分隔符
|
|
sb.WriteByte('_')
|
|
}
|
|
// 根据元素的类型进行不同的处理
|
|
switch v := any(id).(type) {
|
|
case string:
|
|
// 如果是字符串类型,直接写入
|
|
sb.WriteString(v)
|
|
default:
|
|
// 对于其他类型,使用 fmt.Sprint 转换为字符串后写入
|
|
sb.WriteString(fmt.Sprint(v))
|
|
}
|
|
}
|
|
|
|
// 将 strings.Builder 中的内容转换为字符串并返回
|
|
return sb.String()
|
|
}
|