Files
convx/to_string.go
T

92 lines
2.0 KiB
Go
Raw Normal View History

2024-08-15 02:43:22 +00:00
package convx
import (
2025-09-02 15:43:26 +08:00
"encoding/json"
2024-10-27 22:19:20 +08:00
"fmt"
2025-09-02 15:43:26 +08:00
"reflect"
2024-08-15 02:43:22 +00:00
"strconv"
2025-09-02 15:43:26 +08:00
"time"
2024-08-15 02:43:22 +00:00
)
// interface 转 string
2025-09-02 15:43:26 +08:00
// InterfaceToString 将任意interface转换为string
func ToString(v interface{}) string {
if v == nil {
return ""
}
// 获取值的反射对象
val := reflect.ValueOf(v)
// 处理指针类型:解引用直到获取到非指针值
for val.Kind() == reflect.Ptr {
if val.IsNil() {
return ""
}
val = val.Elem()
}
2024-08-15 02:43:22 +00:00
2025-09-02 15:43:26 +08:00
// 获取解引用后的实际值
actualValue := val.Interface()
// 根据具体类型进行处理
switch actual := actualValue.(type) {
2024-10-28 20:33:26 +08:00
case string:
2025-09-02 15:43:26 +08:00
return actual
case []byte:
return string(actual)
case error:
return actual.Error()
case bool:
return strconv.FormatBool(actual)
2024-08-15 02:43:22 +00:00
case int:
2025-09-02 15:43:26 +08:00
return strconv.Itoa(actual)
2024-10-28 20:33:26 +08:00
case int8:
2025-09-02 15:43:26 +08:00
return strconv.FormatInt(int64(actual), 10)
2024-10-28 20:33:26 +08:00
case int16:
2025-09-02 15:43:26 +08:00
return strconv.FormatInt(int64(actual), 10)
2024-08-15 02:43:22 +00:00
case int32:
2025-09-02 15:43:26 +08:00
return strconv.FormatInt(int64(actual), 10)
2024-08-15 02:43:22 +00:00
case int64:
2025-09-02 15:43:26 +08:00
return strconv.FormatInt(actual, 10)
2024-08-15 02:43:22 +00:00
case uint:
2025-09-02 15:43:26 +08:00
return strconv.FormatUint(uint64(actual), 10)
2024-08-15 02:43:22 +00:00
case uint8:
2025-09-02 15:43:26 +08:00
return strconv.FormatUint(uint64(actual), 10)
2024-08-15 02:43:22 +00:00
case uint16:
2025-09-02 15:43:26 +08:00
return strconv.FormatUint(uint64(actual), 10)
2024-10-28 20:33:26 +08:00
case uint32:
2025-09-02 15:43:26 +08:00
return strconv.FormatUint(uint64(actual), 10)
2024-10-28 20:33:26 +08:00
case uint64:
2025-09-02 15:43:26 +08:00
return strconv.FormatUint(actual, 10)
case float32:
return strconv.FormatFloat(float64(actual), 'f', -1, 32)
case float64:
return strconv.FormatFloat(actual, 'f', -1, 64)
case complex64:
return fmt.Sprint(actual)
case complex128:
return fmt.Sprint(actual)
case time.Time:
return actual.Format(time.RFC3339)
case time.Duration:
return actual.String()
case fmt.Stringer:
return actual.String()
}
// 处理切片、数组、map、结构体等复杂类型 - 使用JSON序列化
if val.IsValid() {
switch val.Kind() {
case reflect.Slice, reflect.Array, reflect.Map, reflect.Struct:
jsonBytes, err := json.Marshal(actualValue)
if err == nil {
return string(jsonBytes)
}
}
2024-08-15 02:43:22 +00:00
}
2024-10-28 20:33:26 +08:00
2025-09-02 15:43:26 +08:00
// 默认处理:使用fmt.Sprint
return fmt.Sprint(actualValue)
2024-08-15 02:43:22 +00:00
}