Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions dataType/array.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package dataType

import (
"bytes"
"context"
"database/sql/driver"
"encoding/json"
"fmt"

"gorm.io/gorm"
"gorm.io/gorm/clause"
Expand Down Expand Up @@ -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
Expand Down
Loading