From 594aae76c6fc11841e75fa73214fc58d3b24bc79 Mon Sep 17 00:00:00 2001 From: Yun <995116474@qq.com> Date: Sun, 27 Oct 2024 22:19:20 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=ACint64=E5=92=8C=E8=BD=ACstring=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- to_int64.go | 112 +++++++++++++++++++++++++++++++++++++++++++++------ to_string.go | 2 +- 2 files changed, 101 insertions(+), 13 deletions(-) diff --git a/to_int64.go b/to_int64.go index e81c88d..f289d2f 100644 --- a/to_int64.go +++ b/to_int64.go @@ -7,35 +7,123 @@ import ( // interface 转 int64 func ToInt64(val interface{}) (i int64, err error) { + if val == nil { + return 0, errors.New("value is nil") + } if v, ok := val.(int64); ok { - i = v + return v, nil } else if v, ok := val.(int32); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(string); ok { // string 转 int64 // 第二个参数为基数(2~36),第三个参数位大小表示期望转换的结果类型,其值可以为0, 8, 16, 32和64,分别对应 int, int8, int16, int32和int64 + var i int64 i, err = strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, errors.New("string to int64 error") + } + return i, nil } else if v, ok := val.(float64); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(float32); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(int); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(uint); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(uint32); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(uint64); ok { - i = int64(v) + return int64(v), nil } else if v, ok := val.(bool); ok { if v { - i = 1 + return 1, nil } else { - i = 0 + return 0, nil } } else { - err = errors.New("不支持的参数类型") + return 0, errors.New("不支持的参数类型") } - return } + + + +// 泛型的实现 + + +// package main + +// import ( +// "errors" +// "fmt" +// "reflect" +// "strconv" +// ) + +// 定义一个约束,用于限制可以被转换为int64的类型 +type Int64Convertible interface { + toInt64() int64 +} + +// 实现toInt64方法,用于转换为int64 +func (i *int64) toInt64() int64 { + return *i +} + +// 使用泛型约束来定义函数 +func ToInt642[T any](val T) (int64, error) where T: Int64Convertible { + v := reflect.ValueOf(val) + t := v.Type() + + if v.IsNil() { + return 0, errors.New("值为nil") + } + + switch v.Kind() { + case reflect.String: + i, err := strconv.ParseInt(v.String(), 10, 64) + if err != nil { + return 0, fmt.Errorf("无法将字符串转换为int64: %w", err) + } + return i, nil + case reflect.Bool: + if v.Bool() { + return 1, nil + } + return 0, nil + default: + return v.Interface().(Int64Convertible).toInt64(), nil + } +} + +// 添加对指针类型的处理 +func ToInt64[T any](val T) (int64, error) where T: Int64Convertible { + v := reflect.ValueOf(val) + t := v.Type() + + if v.IsNil() { + return 0, errors.New("值为nil") + } + + if v.Kind() == reflect.Ptr { + v = v.Elem() + t = v.Type() + } + + switch v.Kind() { + case reflect.String: + i, err := strconv.ParseInt(v.String(), 10, 64) + if err != nil { + return 0, fmt.Errorf("无法将字符串转换为int64: %w", err) + } + return i, nil + case reflect.Bool: + if v.Bool() { + return 1, nil + } + return 0, nil + default: + return v.Interface().(Int64Convertible).toInt64(), nil + } +} \ No newline at end of file diff --git a/to_string.go b/to_string.go index b379dee..b8d0027 100644 --- a/to_string.go +++ b/to_string.go @@ -1,7 +1,7 @@ package convx import ( - "errors" + "fmt" "strconv" )