util

package
v1.59.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 17, 2026 License: MIT Imports: 26 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// DefaultTimeLayout 默认展示格式。
	DefaultTimeLayout = "2006-01-02 15:04:05"
	// DateLayout 日期格式。
	DateLayout = "2006-01-02"
)

Time 是封装后的时间类型(内嵌 time.Time):

  • JSON 序列化自动输出 "2006-01-02 15:04:05"(零值输出空串)——接口返回无需额外格式化
  • JSON 反序列化容错解析(多种格式)
  • GORM 兼容(实现 Valuer/Scanner,数据库字段照常存取)
  • 保留 time.Time 全部方法(t.Time() 获取原始值,兼容老逻辑)

用法:

type Order struct {
    PaidAt util.Time `json:"paid_at"` // 数据库存 DATETIME,接口返回 "2026-08-16 01:30:00"
}

对齐 sg-mes-api 痛点:model 时间字段无需在接口查询时额外 FormatTime。

View Source
const (
	// OK defines for string `OK`
	OK = "OK"

	// Default defines for `default` name
	Default = "default"
)

Variables

This section is empty.

Functions

func AddSlashes

func AddSlashes(s string) string

AddSlashes 在字符串的每个引号前添加反斜杠

func CopyProperties added in v1.12.0

func CopyProperties(dst, src interface{}) error

CopyProperties 将 src 的导出字段按「字段名」拷贝到 dst(对标 Java BeanUtils.copyProperties)。 dst 必须为指向结构体的指针;src 为结构体或结构体指针。 规则:

  • 字段名完全匹配(区分大小写);src 有而 dst 没有的字段忽略

  • 类型相同直接赋值;基本数值类型(int 族/float 族)与 string 之间自动转换

  • 嵌套 struct 递归逐字段拷贝(深度上限 8,防循环)

  • 时间互转:util.Time ↔ time.Time ↔ string(自动格式化/解析)

  • 未导出字段、不可设置字段跳过

    type UserDTO struct { Name string; Age int } type UserEntity struct { Name string; Age int64; Extra string } var dto UserDTO util.CopyProperties(&dto, userEntity) // Name 直接拷贝,Age int64→int 自动转换

func CopyPropertiesNonBlank added in v1.33.0

func CopyPropertiesNonBlank(dst, src interface{}) error

CopyPropertiesNonBlank 拷贝属性,但 src 的零值字段不覆盖 dst(空值保护)。 对标 sg-mes-api 的 SimpleCopyProperties2 行为:

  • 字段名 + 类型一致才拷贝
  • src 字段为零值(空串/0/false/nil)时跳过,保留 dst 原值
  • 嵌套 struct 递归逐字段(空值保护生效);时间类型自动互转

与 CopyProperties(无条件覆盖)互补:更新场景用本函数,避免把空值写库。

func CreateFile

func CreateFile(filename string) (*os.File, error)

CreateFile 创建或清空指定的文件 文件已存在,则清空;文件或目录不存在,则以0775权限创建

func Date

func Date(timestamp int64, format ...string) string

Date 格式化时间戳;默认格式:2006-01-02 15:04:05 若 timestamp < 0,则使用 `time.Now()`

func DeepCopy added in v1.12.0

func DeepCopy(src interface{}) (interface{}, error)

DeepCopy 深拷贝任意值(对标 Java 序列化深拷贝): 支持基本类型、string、struct、map、slice、array、指针、interface 的组合嵌套。 结构体中的未导出字段无法复制(反射限制),导出字段递归复制。

func FieldValue added in v1.12.0

func FieldValue(obj interface{}, fieldName string) (interface{}, error)

FieldValue 按字段名读取结构体属性(支持嵌套字段名如 "User.Name")。

func FileHash added in v1.33.0

func FileHash(reader io.Reader, algorithm string) string

FileHash 计算流式文件/数据哈希(对齐 sg-mes FileHash)。 algorithm: "md5" 或 "sha1"(默认 sha1);返回小写 hex。

func FillTree added in v1.41.0

func FillTree[T any](list []T,
	idFn func(*T) int64,
	parentFn func(*T) int64,
	setChildren func(parent *T, children []T),
	rootParentID int64) []T

FillTree 将扁平集合构建为树形结构,并把子节点直接填充进业务实体 (业务 model 自带 Children 字段,前端直接拿到 model 数组)。 对标若依 SysMenu 的 children 模式;与 BuildTree(包装式)互补。

用法:

type Menu struct {
    ID       int64  `json:"id"`
    ParentID int64  `json:"parent_id"`
    Name     string `json:"name"`
    Children []Menu `json:"children"`
}
roots := util.FillTree(menus,
    func(m *Menu) int64 { return m.ID },
    func(m *Menu) int64 { return m.ParentID },
    func(parent *Menu, children []Menu) { parent.Children = children },
    0)
// roots 为 []Menu,每个 Menu.Children 已递归填充,直接 JSON 返回前端

特性:

  • 支持任意层级(N 级)
  • 孤儿节点挂根不丢数据;先序遍历顺序稳定
  • idFn/parentFn/setChildren 均为函数式,任意实体结构适配

func FillTreeString added in v1.41.0

func FillTreeString[T any](list []T,
	idFn func(*T) string,
	parentFn func(*T) string,
	setChildren func(parent *T, children []T),
	rootParentID string) []T

FillTreeString 字符串 ID 版本(UUID 主键)。

func FlattenTree added in v1.40.0

func FlattenTree[T any](trees []*Tree[T]) []T

FlattenTree 树形结构拍平为列表(先序遍历,顺序稳定)。

func FormatTime added in v1.33.0

func FormatTime(t time.Time, format ...string) string

FormatTime 格式化时间;零值(0001-01-01)返回空串(数据库未赋值场景友好)。 format 为空时使用 "2006-01-02 15:04:05"。

func IP2Long

func IP2Long(ip string) uint32

IP2Long IP地址转整数

func IsNilFixed

func IsNilFixed(i interface{}) bool

IsNilFixed 判断当前值是否为nil,i 必须为: Ptr、Map、Array、Chan、Slice

func LoadCertFromPfxFile

func LoadCertFromPfxFile(pfxFile, password string) (tls.Certificate, error)

LoadCertFromPfxFile 通过pfx(p12)文件生成TLS证书 注意:证书需采用「TripleDES-SHA1」加密方式

func Long2IP

func Long2IP(ip uint32) string

Long2IP 整数转IP地址

func MD5 added in v1.12.0

func MD5(s string) string

MD5 计算字符串的 MD5 摘要(32 位小写 hex)。 注意:MD5 仅用于非安全场景(签名校验、去重、缓存键),密码存储请使用 bcrypt/argon2。

func MD5Bytes added in v1.12.0

func MD5Bytes(data []byte) string

MD5Bytes 计算字节数据的 MD5 摘要(32 位小写 hex)。

func MapKeys added in v1.40.0

func MapKeys[K comparable, V any](values map[K]V) []K

MapKeys 返回 map 的全部键。

func MapValues added in v1.40.0

func MapValues[K comparable, V any](values map[K]V) []V

MapValues 返回 map 的全部值。

func MarshalNoEscapeHTML

func MarshalNoEscapeHTML(v any) ([]byte, error)

MarshalNoEscapeHTML 不带HTML转义的JSON序列化

func OpenFile

func OpenFile(filename string) (*os.File, error)

OpenFile 打开指定的文件 文件已存在,则追加内容;文件或目录不存在,则以0775权限创建

func ParseTimeByStr added in v1.33.0

func ParseTimeByStr(value string) time.Time

ParseTimeByStr 容错解析时间字符串;解析失败返回零值(不 panic)。 支持格式按顺序尝试:2006-01-02 15:04:05 / 2006-01-02 15:04 / 2006-01-02。

func QuoteMeta

func QuoteMeta(s string) string

QuoteMeta 在字符串预定义的字符前添加反斜杠

func RandomString added in v1.12.0

func RandomString(n int) (string, error)

RandomString 生成指定长度的随机字母数字串(0-9a-zA-Z)。 随机源失败时返回错误(系统级故障,不建议静默降级)。

func RandomStringMust added in v1.12.0

func RandomStringMust(n int) string

RandomStringMust 生成随机串;失败时 panic(仅限启动期/非关键路径使用)。

func SHA1 added in v1.12.0

func SHA1(s string) string

SHA1 计算字符串的 SHA1 摘要(40 位小写 hex)。

func SHA256 added in v1.12.0

func SHA256(s string) string

SHA256 计算字符串的 SHA256 摘要(64 位小写 hex)。

func SetFieldValue added in v1.12.0

func SetFieldValue(obj interface{}, fieldName string, value interface{}) error

SetFieldValue 按字段名设置结构体属性(支持嵌套字段名)。 value 为 nil 时清空该字段(设为类型零值)。

func SetTimezone

func SetTimezone(loc *time.Location)

SetTimezone 设置时区;默认:GMT+8

func SliceContains added in v1.40.0

func SliceContains[T comparable](list []T, value T) bool

SliceContains 判断切片是否包含指定元素(comparable 类型)。

func SliceFilter added in v1.40.0

func SliceFilter[T any](list []T, fn func(item T) bool) []T

SliceFilter 过滤切片,保留 fn 返回 true 的元素。

func SliceFirst added in v1.40.0

func SliceFirst[T any](list []T, fn func(item T) bool) (T, bool)

SliceFirst 返回第一个匹配元素;未找到返回零值与 false。

func SliceGroupBy added in v1.40.0

func SliceGroupBy[T any, K comparable](list []T, keyFn func(item T) K) map[K][]T

SliceGroupBy 按 key 分组(key 必须 comparable)。

func SliceMap added in v1.40.0

func SliceMap[T any, R any](list []T, fn func(item T) R) []R

SliceMap 转换切片(映射为另一种类型)。

func SliceRand

func SliceRand[T any](a []T, n int) []T

SliceRand 返回一个指定随机挑选个数的切片 若 n == -1 or n >= len(a),则返回打乱的切片

func SliceRemove added in v1.40.0

func SliceRemove[T comparable](list []T, value T) []T

SliceRemove 移除指定元素(返回新切片,不修改原切片)。

func SliceRemoveAll added in v1.40.0

func SliceRemoveAll[T any](list []T, fn func(item T) bool) []T

SliceRemoveAll 移除全部匹配元素(fn 返回 true 的移除)。

func SliceUniq

func SliceUniq[T ~int | ~int64 | ~float64 | ~string](a []T) []T

SliceUniq 切片去重

func StrToTime

func StrToTime(datetime string, format ...string) int64

StrToTime 解析时间字符串为时间戳;默认格式:2006-01-02 15:04:05

func StripSlashes

func StripSlashes(s string) string

StripSlashes 删除字符串中的反斜杠

func UUID added in v1.12.0

func UUID() (string, error)

UUID 生成 UUID v4 字符串(转发 framework/database/id,统一工具入口)。

func UUIDOrEmpty added in v1.12.0

func UUIDOrEmpty() string

UUIDOrEmpty 生成 UUID;失败时返回空串(调用方不关心失败场景时使用)。

func VersionCompare

func VersionCompare(rangeVer, curVer string) (bool, error)

VersionCompare 语义化的版本比较,支持:>, >=, =, !=, <, <=, | (or), & (and). 参数 `rangeVer` 示例:1.0.0, =1.0.0, >2.0.0, >=1.0.0&<2.0.0, <2.0.0|>3.0.0, !=4.0.4

func WalkTree added in v1.40.0

func WalkTree[T any](trees []*Tree[T], fn func(node T, depth int))

WalkTree 深度优先遍历树节点(先序)。

func WeekAround

func WeekAround(timestamp int64, format ...string) (monday, sunday string)

WeekAround 返回给定时间戳所在的周的「周一」和「周日」;默认格式:2006-01-02 15:04:05

Types

type CDATA

type CDATA string

CDATA XML `CDATA` 标记

func (CDATA) MarshalXML

func (c CDATA) MarshalXML(e *xml.Encoder, start xml.StartElement) error

MarshalXML XML 带 `CDATA` 标记序列化

type Pager added in v1.33.0

type Pager struct {
	PageNo   int   // 页码(从 1 开始;<=0 时按 1)
	PageSize int   // 每页数量(<=0 时按 10;>100 时截断为 100)
	Count    int64 // 总条数(查询后设置,用于计算分页信息)
}

Pager 分页参数与计算(对齐 sg-mes 的 PagerReq/PagerRes)。

func (*Pager) FirstPage added in v1.33.0

func (p *Pager) FirstPage() bool

FirstPage 是否首页。

func (*Pager) LastPage added in v1.33.0

func (p *Pager) LastPage() bool

LastPage 是否尾页。

func (*Pager) Limit added in v1.33.0

func (p *Pager) Limit() int

Limit 每页数量。

func (*Pager) Normalize added in v1.33.0

func (p *Pager) Normalize()

Normalize 归一化分页参数。

func (*Pager) Offset added in v1.33.0

func (p *Pager) Offset() int

Offset 分页偏移(limit 前使用)。

func (*Pager) TotalPage added in v1.33.0

func (p *Pager) TotalPage() int

TotalPage 总页数。

type PagerResult added in v1.33.0

type PagerResult struct {
	List      interface{} `json:"list"`
	PageNo    int         `json:"page_no"`
	PageSize  int         `json:"page_size"`
	Total     int64       `json:"total"`
	TotalPage int         `json:"total_page"`
	FirstPage bool        `json:"first_page"`
	LastPage  bool        `json:"last_page"`
}

PagerResult 分页响应(webiris.OK 的 data 用)。

type Time added in v1.34.0

type Time struct {
	time.Time
}

Time 时间类型。

func NewTime added in v1.34.0

func NewTime(t time.Time) Time

NewTime 从 time.Time 构造。

func Now added in v1.34.0

func Now() Time

Now 当前时间。

func Parse added in v1.34.0

func Parse(value string) Time

Parse 解析时间字符串(容错:依次尝试多种格式);失败返回零值。

func ParseE added in v1.34.0

func ParseE(value string) (Time, error)

ParseE 解析时间字符串,失败返回错误。

func (Time) Format added in v1.34.0

func (t Time) Format(layout string) string

Format 按指定格式输出(零值返回空串)。

func (Time) MarshalJSON added in v1.34.0

func (t Time) MarshalJSON() ([]byte, error)

MarshalJSON 序列化为 "2006-01-02 15:04:05"(零值输出空串)。

func (*Time) Scan added in v1.34.0

func (t *Time) Scan(value interface{}) error

Scan 实现 sql.Scanner(GORM 读取)。

func (Time) String added in v1.34.0

func (t Time) String() string

String 格式化输出(零值返回空串)。

func (*Time) UnmarshalJSON added in v1.34.0

func (t *Time) UnmarshalJSON(data []byte) error

UnmarshalJSON 容错解析。

func (Time) Value added in v1.34.0

func (t Time) Value() (driver.Value, error)

Value 实现 driver.Valuer(GORM 写入:存 time.Time)。

type Tree added in v1.40.0

type Tree[T any] struct {
	Node     T          `json:"node"`     // 原始实体
	Children []*Tree[T] `json:"children"` // 子节点(N 级递归)
}

Tree 树节点包装:保留原始实体 + 子节点列表。

func BuildTree added in v1.40.0

func BuildTree[T any](list []T, idFn func(T) int64, parentFn func(T) int64, rootParentID int64) []*Tree[T]

BuildTree 将扁平集合构建为树形结构(泛型,任意实体)。 idFn/parentFn 分别提取节点 ID 与父 ID;rootParentID 为根节点的父 ID (通常传 0 或 -1,按业务约定)。

用法:

type Menu struct { ID int64; ParentID int64; Name string }
trees := util.BuildTree(menus,
    func(m Menu) int64 { return m.ID },
    func(m Menu) int64 { return m.ParentID },
    0)
// trees[i].Node.Name 为根菜单,trees[i].Children 递归子菜单

特性:

  • 支持任意层级(N 级)
  • 父节点不存在/孤儿节点挂在根下(不丢失数据)
  • 保持输入顺序稳定(先序遍历)

func BuildTreeString added in v1.40.0

func BuildTreeString[T any](list []T, idFn func(T) string, parentFn func(T) string, rootParentID string) []*Tree[T]

BuildTreeString 与 BuildTree 同,ID 为字符串类型(如 UUID 主键)。

type X

type X map[string]any

X `map[string]any` 的别名.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL