cast

package module
v1.5.3 Latest Latest
Warning

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

Go to latest
Published: Jun 21, 2026 License: MIT Imports: 14 Imported by: 0

README

@go/cast

Maintainer Statement: 本项目完全由 AI 维护。任何改动均遵循代码质量与性能的最佳实践。

🎯 设计哲学

@go/cast 是一个为“极致敏捷”设计的 Go 基础工具库。其核心目标是彻底消除摩擦

  • 万能零摩擦入口To[T]、Convert 作为核心 API,永不返回 error。在失败或非法转换时静默返回类型零值。
  • 语义化 As 包装:提供 As 函数用于将传统“值+错误”双返回结果一键转化为单值,消除外部库带来的摩擦。
  • 智能自动穿透To[T]、Convert 自动识别 JSON 文本、复杂容器映射、指针穿透等场景。
  • 极致性能 JSON:内置高性能 fastjson 引擎,支持 Struct 元数据缓存、time.Time 原生处理、零分配 Key 匹配及批量转义优化。

📦 安装

go get apigo.cc/go/cast

💡 快速开始

import "apigo.cc/go/cast"

// 1. 万能转换 (To[T] 永不报错,遇错返回零值)
age := cast.To[int]("18")   // 18
uid := cast.To[int]("abc")  // 0 (静默失败)

// 2. 传统函数消除摩擦 (As 将双返回包装为单值)
b := cast.As(json.Marshal(data)) // 返回 []byte,忽略 error

// 3. 智能 JSON 自动转换
// 输入 map/struct -> 目标 string: 自动序列化
js := cast.To[string](map[string]int{"age": 18}) // `{"age":18}`

// 输入 string/[]byte -> 目标 struct/map: 自动反序列化
user := cast.To[User](`{"name":"Tom"}`)

// 4. 复杂容器转换 (Map/Slice)
m, _ := cast.ToMap[string, int]([]any{"id", "1"}) 
list, _ := cast.ToSlice[int]([]string{"1", "2", "3"})

🛠 API 指南

核心 API
  1. 通用转换 (Frictionless)

    • To[T any](any) T —— 万能转换入口。支持基础类型、Slice、Map 以及 JSON 的双向自动转换。失败时返回类型零值。
    • Convert(dst, src any) —— 原地转换。第一个参数为目标对象指针,支持深度映射、自动包装/解包、ParseHook 等。
    • 支持矩阵:
      • string/[]byte <-> struct/map/slice (自动 JSON 编解码)
      • string (CSV) -> slice (自动逗号分隔转换)
      • map <-> struct (字段名智能模糊匹配)
      • []any <-> map (KV 序列展开/折叠)
      • func <-> func (自动参数类型适配转换)
      • 所有基础类型 (int, string, bool, float, duration, time.Time) 互相转换。
  2. 错误处理工具

    • As[T any](v T, err error) T —— 错误消除工具。将传统的 (value, error) 返回值包装为单值。
  3. 容器转换 (Strict)

    • ToMap[K, V](any) (map[K]V, error) —— 构建新 Map。
    • ToSlice[T](any) ([]T, error) —— 构建新 Slice。
    • FillMap(target, source) | FillSlice(target, source) —— 填充现有容器。
  4. JSON 序列化与构建 (Strict)

    • 编码: ToJSON(any) (string, error) | ToJSONBytes(any) ([]byte, error)
    • 解码: UnmarshalJSON(data, target) error | FromJSON[T](any) (T, error)
    • 时间支持: 原生支持 time.Time。支持 Tag 格式定义:json:"time_field,format=2006-01-02"
    • 其他: ToJSONDesensitizeBytes(any, []string) ([]byte, error) | PrettyToJSON(any) string
  5. 泛型工具

    • If[T any](bool, T, T) T —— 三元逻辑。
    • In[T comparable]([]T, T) bool —— 包含判断。
    • Ptr[T any](T) *T —— 快速取指针。
    • ArrayToBoolMap[T comparable]([]T) map[T]bool —— 快速构建索引 Map。
  6. 基础转换与时间 (直接调用,极致性能)

    • Int, Int64, Uint, Uint64, Float, Float64, String, Bool, Duration
    • RealValue(reflect.Value) reflect.Value —— 递归获取指针或接口下的真实值。
    • ParseTime(any) time.Time —— 强大的时间解析,支持时间戳、RFC3339、JS 格式、紧凑格式及中文日期。
    • FormatTime(layout, any) string —— 直观格式化(如 YYYY-MM-DD HH:mm:ss)。
    • AddTime(expr, any) time.Time —— DSL 时间计算(如 +1Y-2M+3D)。
    • DescribeDuration(time.Duration) string —— 将时长转化为自然语言描述(如 1h 5m)。
  7. 字符串与参数处理

    • Split(s, sep string) []string —— 增强型分割,自动 Trim 并过滤空字符串。
    • SplitArgs(string) []string —— 命令行参数分割,支持引号与转义。
    • JoinArgs([]string, sep string) string —— 命令行参数合并,自动处理引号与转义。
    • UniqueAppend(to []string, from ...any) []string —— 去重追加。
    • GetLowerName(string) string | GetUpperName(string) string —— 首字母大小写转换工具。
    • FixUpperCase([]byte, []string) —— 针对 JSON Key 的特殊大小写修复工具。
  8. 时区支持

    • DefaultTimeZone —— 全局默认时区上下文。
    • SetDefaultTimeZone(*time.Location) —— 修改全局默认时区(影响所有 Convert 与 ToTime 操作)。
    • DefaultTimeZone.Now() —— 获取时区上下文下的当前时间。
    • NewTimeZone(*time.Location) —— 创建一个时区上下文,支持 Parse、Format、Add、Now 等操作。

🧪 验证状态

测试全部通过,性能达标。

详见:TEST.md

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DefaultTimeZone = NewTimeZone(time.Local)

DefaultTimeZone 全局默认时区,默认为本地时区

Functions

func AddTime added in v1.2.3

func AddTime(expr string, v any) time.Time

AddTime 时间加减 DSL。

func ArrayToBoolMap added in v1.0.4

func ArrayToBoolMap[T comparable](arr []T) map[T]bool

func As added in v1.2.0

func As[T any](v T, err error) T

As 忽略错误,返回零值 (消除摩擦)

func Bool

func Bool(value any) bool

func Convert added in v1.2.3

func Convert(dst, src any)

Convert 深度转换 (支持基础类型、Slice、Map、Struct 及 JSON 自动转换,原地更新)

func DescribeDuration added in v1.2.5

func DescribeDuration(d time.Duration) string

DescribeDuration 将时长转化为自然语言描述

func Duration

func Duration(value any) time.Duration

func FillMap added in v1.2.0

func FillMap(target any, source any)

FillMap 将 source 填充到目标 map 中

func FillSlice added in v1.2.0

func FillSlice(target any, source any)

FillSlice 将 source 填充到目标 slice 中

func FixUpperCase

func FixUpperCase(data []byte, excludesKeys []string)

FixUpperCase (保留以支持历史复杂的 Key 转换需求)

func Float

func Float(value any) float32

func Float64

func Float64(value any) float64

func FormatTime added in v1.2.3

func FormatTime(layout string, v any) string

FormatTime 格式化时间。

func FromJSON added in v1.1.2

func FromJSON[T any](data any) (T, error)

func GetLowerName

func GetLowerName(s string) string

补充缺失的 Key 转换工具

func GetUpperName

func GetUpperName(s string) string

func If

func If[T any](condition bool, trueVal, falseVal T) T

If 泛型三元表达式

func In

func In[T comparable](arr []T, val T) bool

In 泛型包含判断

func Int

func Int(value any) int

func Int64

func Int64(value any) int64

func JoinArgs added in v1.0.4

func JoinArgs(arr []string, sep string) string

func Now added in v1.2.3

func Now() time.Time

Now 获取当前时间

func ParseTime added in v1.2.3

func ParseTime(v any) time.Time

ParseTime 将任意类型转换为 time.Time。

func PrettyToJSON added in v1.0.4

func PrettyToJSON(value any) string

func Ptr added in v1.0.4

func Ptr[T any](v T) *T

指针工具

func RealValue

func RealValue(v reflect.Value) reflect.Value

func SetDefaultTimeZone added in v1.2.3

func SetDefaultTimeZone(loc *time.Location)

SetDefaultTimeZone 修改全局默认时区

func Split added in v1.0.4

func Split(s, sep string) []string

func SplitArgs

func SplitArgs(s string) []string

func String

func String(value any) string

func To added in v1.2.0

func To[T any](v any) T

To 深度转换 (支持基础类型、Slice、Map、Struct 及 JSON 自动转换,零摩擦模式)

func ToFloat64E added in v1.2.0

func ToFloat64E(v any) (float64, error)

func ToInt64E added in v1.2.0

func ToInt64E(v any) (int64, error)

func ToJSON added in v1.0.4

func ToJSON(value any) (string, error)

func ToJSONBytes added in v1.0.4

func ToJSONBytes(value any) ([]byte, error)

func ToJSONDesensitizeBytes added in v1.1.0

func ToJSONDesensitizeBytes(value any, keys []string) ([]byte, error)

func ToMap added in v1.1.2

func ToMap[K comparable, V any](source any) (map[K]V, error)

ToMap 泛型构建新 Map

func ToSlice added in v1.1.2

func ToSlice[T any](source any) ([]T, error)

ToSlice 泛型构建新 Slice

func ToTime added in v1.2.3

func ToTime(v any, format string) time.Time

func ToUint64E added in v1.2.0

func ToUint64E(v any) (uint64, error)

func Uint

func Uint(value any) uint

func Uint64

func Uint64(value any) uint64

func UniqueAppend added in v1.0.4

func UniqueAppend(to []string, from ...any) []string

func UnmarshalJSON added in v1.0.4

func UnmarshalJSON(data any, value any) error

Types

type TimeZone added in v1.2.3

type TimeZone struct {
	// contains filtered or unexported fields
}

TimeZone 定义了特定时区上下文下的时间操作

func NewTimeZone added in v1.2.3

func NewTimeZone(loc *time.Location) *TimeZone

NewTimeZone 创建一个时区上下文

func (*TimeZone) AddTime added in v1.2.3

func (tz *TimeZone) AddTime(expr string, v any) time.Time

AddTime 时间加减 DSL。 格式如: "+1Y-2M+3D", "+1h30m", "-1s"。 单位支持: Y (年), M (月), D (天), h, m, s, ms, us, ns。

func (*TimeZone) DescribeDuration added in v1.2.5

func (tz *TimeZone) DescribeDuration(d time.Duration) string

DescribeDuration 将时长转化为自然语言描述,例如 "1h 1m 1s"

func (*TimeZone) FormatTime added in v1.2.3

func (tz *TimeZone) FormatTime(layout string, v any) string

FormatTime 格式化时间。 layout 支持: YYYY-MM-DD HH:mm:ss, YYYY/MM/DD, HH:mm 等直观格式。

func (*TimeZone) Location added in v1.2.5

func (tz *TimeZone) Location() *time.Location

Location 获取当前时区

func (*TimeZone) Now added in v1.2.3

func (tz *TimeZone) Now() time.Time

Now 获取当前时间

func (*TimeZone) ParseTime added in v1.2.3

func (tz *TimeZone) ParseTime(v any) time.Time

ParseTime 将任意类型转换为 time.Time。 支持:time.Time, 时间戳 (秒/毫秒/微秒/纳秒), RFC3339, JS 格式, 中文格式等。 转换失败返回零值 time.Time{} 以保持 cast 的静默风格。

Jump to

Keyboard shortcuts

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