-
Notifications
You must be signed in to change notification settings - Fork 1
/
slice.go
42 lines (36 loc) · 836 Bytes
/
slice.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package types
import (
"database/sql/driver"
"encoding/json"
"errors"
)
// Slice 实现任意切片类型
type Slice[T any] []T
// Scan implements the Scanner interface.
func (s *Slice[T]) Scan(src any) error {
if src == nil {
return nil
}
if src, ok := src.([]byte); ok {
if err := json.Unmarshal(src, s); err == nil {
return nil
}
}
return errors.New("try scan to Slice[T] failure")
}
// Value implements the driver Valuer interface.
func (t Slice[T]) Value() (driver.Value, error) {
if t == nil {
return nil, nil
}
return json.Marshal(t)
}
// String implements flag.Value::String interface.
func (t Slice[T]) String() string {
val, _ := json.Marshal(t)
return string(val)
}
// Set implements flag.Value::Set interface.
func (t *Slice[T]) Set(val string) error {
return json.Unmarshal([]byte(val), t)
}