2025-04-12 18:03:44 +08:00
|
|
|
|
package u
|
|
|
|
|
|
|
2025-11-17 18:38:10 +08:00
|
|
|
|
import (
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
)
|
2025-04-12 18:03:44 +08:00
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
// ====================
|
|
|
|
|
|
// 逻辑
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
|
|
|
|
|
|
func Else[T any](v *T, or T) T {
|
|
|
|
|
|
if v == nil {
|
|
|
|
|
|
return or
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return *v
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-08 14:22:30 +08:00
|
|
|
|
// 三元表达式
|
|
|
|
|
|
func Ternary[T any](condition bool, trueValue T, falseValue T) T {
|
|
|
|
|
|
if condition {
|
|
|
|
|
|
return trueValue
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return falseValue
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
// ====================
|
|
|
|
|
|
// 指针
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
|
|
|
|
|
|
// P 原地创建值的指针
|
2025-04-12 18:03:44 +08:00
|
|
|
|
func P[T any](v T) *T {
|
|
|
|
|
|
return &v
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
// Z 转换值为不可空,如果值为 nil,则返回其零值
|
2025-11-17 18:38:10 +08:00
|
|
|
|
func Z[T any](v *T) T {
|
|
|
|
|
|
if v == nil {
|
|
|
|
|
|
var zero T
|
|
|
|
|
|
return zero
|
|
|
|
|
|
}
|
|
|
|
|
|
return *v
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
// X 转换值为可空,如果值为零值,则返回 nil
|
2025-11-17 18:38:10 +08:00
|
|
|
|
func X[T comparable](v T) *T {
|
|
|
|
|
|
var zero T
|
|
|
|
|
|
if v == zero {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return &v
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-15 16:56:24 +08:00
|
|
|
|
// N 零值视为 nil
|
|
|
|
|
|
func N[T comparable](v *T) *T {
|
|
|
|
|
|
if v == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
var zero T
|
|
|
|
|
|
if *v == zero {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return v
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
// ====================
|
|
|
|
|
|
// 数组
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
|
|
|
|
|
|
func Map[T any, R any](src []T, convert func(T) R) []R {
|
|
|
|
|
|
dst := make([]R, len(src))
|
|
|
|
|
|
for i, item := range src {
|
|
|
|
|
|
dst[i] = convert(item)
|
|
|
|
|
|
}
|
|
|
|
|
|
return dst
|
2025-04-12 18:03:44 +08:00
|
|
|
|
}
|
2025-05-26 10:57:39 +08:00
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
// ====================
|
|
|
|
|
|
// 时间
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
|
|
|
|
|
|
func DateHead(date time.Time) time.Time {
|
|
|
|
|
|
var y, m, d = date.Date()
|
|
|
|
|
|
return time.Date(y, m, d, 0, 0, 0, 0, date.Location())
|
2025-07-01 18:23:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-23 14:26:10 +08:00
|
|
|
|
func DateTail(date time.Time) time.Time {
|
2025-11-24 18:44:06 +08:00
|
|
|
|
var y, m, d = date.Date()
|
|
|
|
|
|
return time.Date(y, m, d, 23, 59, 59, 999999999, date.Location())
|
2025-07-01 18:23:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
func Today() time.Time {
|
|
|
|
|
|
return DateHead(time.Now())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func IsSameDate(date1, date2 time.Time) bool {
|
|
|
|
|
|
var y1, m1, d1 = date1.Date()
|
|
|
|
|
|
var y2, m2, d2 = date2.Date()
|
|
|
|
|
|
return y1 == y2 && m1 == m2 && d1 == d2
|
2025-06-04 19:02:21 +08:00
|
|
|
|
}
|
2025-11-17 18:38:10 +08:00
|
|
|
|
|
2025-11-24 18:44:06 +08:00
|
|
|
|
func IsToday(date time.Time) bool {
|
|
|
|
|
|
return IsSameDate(date, time.Now())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
// 错误
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
|
2025-11-17 18:38:10 +08:00
|
|
|
|
func CombineErrors(errs []error) error {
|
|
|
|
|
|
var combinedErr error = nil
|
|
|
|
|
|
for _, err := range errs {
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
if combinedErr == nil {
|
|
|
|
|
|
combinedErr = err
|
|
|
|
|
|
} else {
|
|
|
|
|
|
combinedErr = fmt.Errorf("%v; %w", combinedErr, err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return combinedErr
|
|
|
|
|
|
}
|
2026-04-15 16:56:24 +08:00
|
|
|
|
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
// 业务
|
|
|
|
|
|
// ====================
|
|
|
|
|
|
|
|
|
|
|
|
func MaskPhone(phone string) string {
|
|
|
|
|
|
if len(phone) < 11 {
|
|
|
|
|
|
return phone
|
|
|
|
|
|
}
|
|
|
|
|
|
return phone[:3] + "****" + phone[7:]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func MaskIdNo(idNo string) string {
|
|
|
|
|
|
if len(idNo) < 18 {
|
|
|
|
|
|
return idNo
|
|
|
|
|
|
}
|
|
|
|
|
|
return idNo[:3] + "*********" + idNo[14:]
|
|
|
|
|
|
}
|