增加自定义BigInt类型 #7
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