diff --git a/dataType/array.go b/dataType/array.go index 957ec4a..0ed3fb1 100644 --- a/dataType/array.go +++ b/dataType/array.go @@ -1,8 +1,11 @@ package dataType import ( + "bytes" "context" "database/sql/driver" + "encoding/json" + "fmt" "gorm.io/gorm" "gorm.io/gorm/clause" @@ -32,6 +35,73 @@ func (a AnyArray[T]) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { return arrayGormValue(a, db) } +func (a AnyArray[T]) MarshalJSON() ([]byte, error) { + if a == nil { + return []byte("null"), nil + } + return json.Marshal(a) +} + +func (a *AnyArray[T]) UnmarshalJSON(b []byte) error { + // 处理 null + if bytes.Equal(b, []byte("null")) { + *a = nil + return nil + } + + var tmp []T + if err := json.Unmarshal(b, &tmp); err != nil { + return err + } + *a = tmp + return nil +} + +// ToSlice 转换为普通切片 +func (a AnyArray[T]) ToSlice() []T { + return []T(a) +} + +// NewAnyArrayFromSlice 从普通切片创建 +func NewAnyArrayFromSlice[T any](s []T) AnyArray[T] { + return AnyArray[T](s) +} + +// IsEmpty 判空 +func (a AnyArray[T]) IsEmpty() bool { + return len(a) == 0 +} + +// Copy 深拷贝 +func (a AnyArray[T]) Copy() AnyArray[T] { + tmp := make([]T, len(a)) + copy(tmp, a) + return tmp +} + +// Append 追加元素 +func (a *AnyArray[T]) Append(elems ...T) { + *a = append(*a, elems...) +} + +// Get 获取元素(带边界检查) +func (a AnyArray[T]) Get(index int) (T, error) { + if index < 0 || index >= len(a) { + var zero T + return zero, fmt.Errorf("index out of range: %d", index) + } + return a[index], nil +} + +// Set 设置元素 +func (a *AnyArray[T]) Set(index int, value T) error { + if index < 0 || index >= len(*a) { + return fmt.Errorf("index out of range: %d", index) + } + (*a)[index] = value + return nil +} + type Array []any // Value return json value, implement driver.Valuer interface