From 0baef759a0e700cfe5ad953390358660a1d70679 Mon Sep 17 00:00:00 2001 From: yun Date: Thu, 15 Aug 2024 02:43:22 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96ToString?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- to_string.go | 123 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 79 insertions(+), 44 deletions(-) diff --git a/to_string.go b/to_string.go index a545eda..b379dee 100644 --- a/to_string.go +++ b/to_string.go @@ -1,44 +1,79 @@ -package convx - -import ( - "errors" - "strconv" -) - -// interface 转 string -func ToString(val interface{}) (str string, err error) { - - var s string - if vv, ok := val.(float32); ok { - s = strconv.FormatFloat(float64(vv), 'f', -1, 32) - } else if vv, ok := val.(float64); ok { - s = strconv.FormatFloat(vv, 'f', -1, 64) - } else if vv, ok := val.(int); ok { - s = strconv.Itoa(vv) - } else if vv, ok := val.(int32); ok { - s = strconv.Itoa(int(vv)) - } else if vv, ok := val.(int64); ok { - s = strconv.FormatInt(vv, 10) - } else if vv, ok := val.(string); ok { - s = vv - } else if vv, ok := val.(bool); ok { - s = strconv.FormatBool(vv) - } else if vv, ok := val.(uint); ok { - s = strconv.FormatUint(uint64(vv), 10) - } else if vv, ok := val.(uint32); ok { - s = strconv.FormatUint(uint64(vv), 10) - } else if vv, ok := val.(uint64); ok { - s = strconv.FormatUint(vv, 10) - } else if vv, ok := val.(uint8); ok { - s = strconv.FormatUint(uint64(vv), 10) - } else if vv, ok := val.(uint16); ok { - s = strconv.FormatUint(uint64(vv), 10) - } else if vv, ok := val.(int8); ok { - s = strconv.FormatInt(int64(vv), 10) - } else if vv, ok := val.(int16); ok { - s = strconv.FormatInt(int64(vv), 10) - } else { - return s, errors.New("不支持的参数类型") - } - return s, nil -} +package convx + +import ( + "errors" + "strconv" +) + +// interface 转 string +// func ToString(val interface{}) (str string, err error) { + +// var s string +// if vv, ok := val.(float32); ok { +// s = strconv.FormatFloat(float64(vv), 'f', -1, 32) +// } else if vv, ok := val.(float64); ok { +// s = strconv.FormatFloat(vv, 'f', -1, 64) +// } else if vv, ok := val.(int); ok { +// s = strconv.Itoa(vv) +// } else if vv, ok := val.(int32); ok { +// s = strconv.Itoa(int(vv)) +// } else if vv, ok := val.(int64); ok { +// s = strconv.FormatInt(vv, 10) +// } else if vv, ok := val.(string); ok { +// s = vv +// } else if vv, ok := val.(bool); ok { +// s = strconv.FormatBool(vv) +// } else if vv, ok := val.(uint); ok { +// s = strconv.FormatUint(uint64(vv), 10) +// } else if vv, ok := val.(uint32); ok { +// s = strconv.FormatUint(uint64(vv), 10) +// } else if vv, ok := val.(uint64); ok { +// s = strconv.FormatUint(vv, 10) +// } else if vv, ok := val.(uint8); ok { +// s = strconv.FormatUint(uint64(vv), 10) +// } else if vv, ok := val.(uint16); ok { +// s = strconv.FormatUint(uint64(vv), 10) +// } else if vv, ok := val.(int8); ok { +// s = strconv.FormatInt(int64(vv), 10) +// } else if vv, ok := val.(int16); ok { +// s = strconv.FormatInt(int64(vv), 10) +// } else { +// return s, errors.New("不支持的参数类型") +// } +// return s, nil +// } + +func ToString(val interface{}) (string, error) { + switch v := val.(type) { + case float32: + return strconv.FormatFloat(float64(v), 'f', -1, 32), nil + case float64: + return strconv.FormatFloat(v, 'f', -1, 64), nil + case int: + return strconv.Itoa(v), nil + case int32: + return strconv.Itoa(int(v)), nil + case int64: + return strconv.FormatInt(v, 10), nil + case string: + return v, nil + case bool: + return strconv.FormatBool(v), nil + case uint: + return strconv.FormatUint(uint64(v), 10), nil + case uint32: + return strconv.FormatUint(uint64(v), 10), nil + case uint64: + return strconv.FormatUint(v, 10), nil + case uint8: + return strconv.FormatUint(uint64(v), 10), nil + case uint16: + return strconv.FormatUint(uint64(v), 10), nil + case int8: + return strconv.FormatInt(int64(v), 10), nil + case int16: + return strconv.FormatInt(int64(v), 10), nil + default: + return fmt.Sprintf("%v", val), nil + } +} 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 2/2] =?UTF-8?q?=E8=BD=ACint64=E5=92=8C=E8=BD=ACstring?= =?UTF-8?q?=E4=BC=98=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" )