增加自定义BigInt类型
This commit is contained in:
parent
cfdb588156
commit
fc0aa6cd5a
118
bigint.go
Normal file
118
bigint.go
Normal file
@ -0,0 +1,118 @@
|
||||
// Package wrapper ...
|
||||
//
|
||||
// Description : wrapper ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2024-11-19 16:33
|
||||
package wrapper
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// BigInt 是一个自定义类型,用于在JSON编码时将int64转换为字符串。
|
||||
// 建议只在Output中使用它,Input时直接使用int64。
|
||||
type BigInt string
|
||||
|
||||
var EmptyBigInt BigInt = "0"
|
||||
|
||||
func (f *BigInt) IsNil() bool {
|
||||
if nil == f {
|
||||
return true
|
||||
}
|
||||
return reflect.ValueOf(*f).IsNil()
|
||||
}
|
||||
|
||||
// MarshalJSON 自定义的JSON编码逻辑。
|
||||
// @implements json.Marshaler
|
||||
func (f *BigInt) MarshalJSON() ([]byte, error) {
|
||||
return []byte(fmt.Sprintf(`"%d"`, f.Int64())), nil
|
||||
}
|
||||
|
||||
// ToString 返回BigId的字符串表示。
|
||||
func (f *BigInt) String() string {
|
||||
if f.IsNil() {
|
||||
return string(EmptyBigInt)
|
||||
}
|
||||
return string(*f)
|
||||
}
|
||||
|
||||
// Value 在orm写入数据库时会调用它进行格式转换.
|
||||
// @implements database/sql/driver.Valuer
|
||||
func (f *BigInt) Value() (driver.Value, error) {
|
||||
if f.IsNil() {
|
||||
return 0, nil
|
||||
}
|
||||
return f.Uint64(), nil
|
||||
}
|
||||
|
||||
// Int64 返回BigId的int64表示。
|
||||
// @implements github.com/gogf/gf/v2/util/gconv.iInt64
|
||||
func (f *BigInt) Int64() int64 {
|
||||
if f.IsNil() {
|
||||
return 0
|
||||
}
|
||||
i, err := strconv.ParseInt(string(*f), 10, 64)
|
||||
if err != nil || i <= 0 {
|
||||
return 0
|
||||
}
|
||||
return i
|
||||
}
|
||||
|
||||
// Uint64 返回BigId的uint64表示。
|
||||
// @implements github.com/gogf/gf/v2/util/gconv.iUint64
|
||||
func (f *BigInt) Uint64() uint64 {
|
||||
if f.IsNil() {
|
||||
return 0
|
||||
}
|
||||
return uint64(f.Int64())
|
||||
}
|
||||
|
||||
// IsEmpty 判断BigId是否为空
|
||||
func (f *BigInt) IsEmpty() bool {
|
||||
if f.IsNil() {
|
||||
return true
|
||||
}
|
||||
return *f == "" || *f == EmptyBigInt || f.Int64() == 0
|
||||
}
|
||||
|
||||
// UnmarshalJSON converts a json byte array of a big ID into an BigInt type.
|
||||
// @implements json.Unmarshaler
|
||||
func (f *BigInt) UnmarshalJSON(b []byte) error {
|
||||
var (
|
||||
s = string(b)
|
||||
)
|
||||
// 如果是null,设置为0
|
||||
if s == "null" || s == "" || s == "0" {
|
||||
*f = EmptyBigInt
|
||||
return nil
|
||||
}
|
||||
// 如果是字符串,去掉引号
|
||||
if len(b) >= 3 && b[0] == '"' && b[len(b)-1] == '"' {
|
||||
s = string(b[1 : len(b)-1])
|
||||
}
|
||||
|
||||
*f = StrToBigInt(s)
|
||||
return nil
|
||||
}
|
||||
|
||||
// ToBigInt 将int转换为BigInt
|
||||
func ToBigInt(id int64) BigInt {
|
||||
if id <= 0 {
|
||||
return EmptyBigInt
|
||||
}
|
||||
return BigInt(fmt.Sprintf("%d", id))
|
||||
}
|
||||
|
||||
// StrToBigInt 将str转换为BigInt类型
|
||||
func StrToBigInt(id string) BigInt {
|
||||
i, err := strconv.ParseInt(id, 10, 64)
|
||||
if err != nil || i <= 0 {
|
||||
return EmptyBigInt
|
||||
}
|
||||
return BigInt(id)
|
||||
}
|
Loading…
Reference in New Issue
Block a user